2

我已经阅读了有关 Shiny 编码问题的线程和包更新,但我有一个(难以重现的示例)数据库驱动的 Shiny 应用程序,它正在摸索一些特殊字符。

在我的 postgresql 数据库中,我正确地看到了我的瑞典河"Umeälven River",当我使用 dplyr 将其过滤回 Shiny 界面时: names.rivers <- filter(tbl.rivers, Country == "Sweden") ...变成R 中的"Umeälven River"

我在本地使用 UTF-8 编码;我想我在与数据库的交换中丢失了一些东西。

Sys.getlocale() [1] "LC_COLLATE=French_France.1252;LC_CTYPE=French_France.1252;LC_MONETARY=French_France.1252;LC_NUMERIC=C;LC_TIME=French_France.1252"

再次为缺乏示例道歉,这只是从数据库中提取的问题。我怀疑我在某个地方的某些消毒功能上遗漏了一个标志,但需要一些帮助才能指明正确的方向。

4

2 回答 2

1

正如怀疑的那样,答案很简单: iconv(vector.to.convert, "UTF-8")

我的“学习”:

  1. 源文件、数据库和数据流的编码不是一回事;
  2. 我花时间确保数据源是以正确的编码创建的,忽略了数据流的(隐式?)转换;
  3. 这个页面有帮助:http ://shiny.rstudio.com/articles/unicode.html

我的理解有点肤浅,但坦率地说,我暂时没有深入研究字符编码的世界。我希望它可以帮助其他人避免错误!

于 2016-08-11T07:20:51.620 回答
1

在您的代码页 1252 Windows Latin 1中,“ä”的呈现Upper Umeälven River是代码点 0xE4(二进制 11100100)。

Upper Umeälven River同一代码页中有两个八位字节 0xC3A4 (XXX00011 XX100100)。

但是,如果考虑代码点的UTF-8 编码规则,则有效位完全相同。

某处发生了无意或错误的字符编码,将字符转换为 UTF-8,但仍认为该字符串具有 Windows Latin 1 代码页。

也许数据已经以 UTF-8 格式接收,您可以将代码页更改为接收代码页以反映这一点。可能在更远的地方发生了无声的转变,没有迹象表明这一点。

于 2016-08-10T18:15:01.423 回答