字符编码,带数据库的 dplyr (postgresql)

character encoding, dplyr with database (postgresql)

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

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

中变为 "Upper 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"

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

在您的 code page 1252 Windows Latin 1 中,Upper Umeälven River 中 'ä' 的渲染是代码点 0xE4(二进制 11100100)。

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

但是如果考虑码位的UTF-8 encoding rules,有效位是完全一样的

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

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

正如所料,答案很简单: iconv(vector.to.convert, "UTF-8")

我的"learnings":

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

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