强制设置编码从未知到UTF-8或R中的任何编码?

Mat*_*ert 13 encoding r iconv

我正在从旧的专有数据库中读取数据.不幸的是,我最终(仅限一些字符串)Encoding(mychar_vector)返回"unknown".不幸的是我在封闭源c hli(宿主语言界面)周围使用了一个包装器,所以我可能做的不多 - 如果是这样的话我很高兴在这里被证明是错的......

但是,查看字符串向量除了一些替换,我必须使用字符串看看(请参阅我的相关问题)gsub看起来不错.我很想重新控制编码.有没有办法强制将编码设置为UTF-8?我试过了

Encoding(mychar_vector) <- "UTF-8"
# or
mychar_vector <- enc2utf8(mychar_vector)
Run Code Online (Sandbox Code Playgroud)

但这一切都没有成功."unknown"检查后立即得到回报.也进行了调查,iconv但显然没有办法从"未知"转换为UTF-8,因为没有映射.

有没有办法告诉R,只涉及UTF-8字符,因此编码可以设置为UTF-8.请注意,向量的某些元素已经是UTF-8.

Jem*_*s42 5

我也曾陷入编码兔子洞,我学到的重要事情之一是"unknown"编码并不一定意味着它不是 UTF-8。还是不好。或者有什么需要修复的地方。

\n

这里有些例子:

\n\n
# Some string that might be UTF-8 or just some ASCII (but created in UTF-8 editor/environment)\nambiguous <- "wat"\nEncoding(ambiguous)\n#> [1] "unknown"\n\n# Forced coercion to UTF-8 via stringi\nambiguous <- stringi::stri_enc_toutf8("wat", is_unknown_8bit = TRUE)\n\n# Still ambiguous\nEncoding(ambiguous)\n#> [1] "unknown"\n\n# Some pretty-sure-not-ASCII string\ntotallygermanic <- "w\xc3\xa4t"\n\n# It\'s UTF-8 because that\'s what my RStudio and every other part of my env is set to\nEncoding(totallygermanic)\n#> [1] "UTF-8"\n\n# Let\'s force it to be unknowm\nEncoding(totallygermanic) <- "unknown"\n\n# Still prints ok\ntotallygermanic\n#> [1] "w\xc3\xa4t"\n\n# What\'s its encoding now?\nEncoding(totallygermanic)\n#> [1] "unknown"\n\n# Converting it to UTF-8 still prints ok\nstringi::stri_enc_toutf8(totallygermanic)\n#> [1] "w\xc3\xa4t"\n\n# So the converted string is UTF-8, right? No.\nEncoding(stringi::stri_enc_toutf8(totallygermanic))\n#> [1] "unknown"\n\n# Maybe we should just guess?\nstringi::stri_enc_detect("wat")\n#> [[1]]\n#>     Encoding Language Confidence\n#> 1 ISO-8859-1       en       0.75\n#> 2 ISO-8859-2       ro       0.75\n#> 3      UTF-8                0.15\n\nstringi::stri_enc_detect("w\xc3\xa4t")\n#> [[1]]\n#>   Encoding Language Confidence\n#> 1    UTF-8                 0.8\n#> 2 UTF-16BE                 0.1\n#> 3 UTF-16LE                 0.1\n#> 4  GB18030       zh        0.1\n#> 5   EUC-JP       ja        0.1\n#> 6   EUC-KR       ko        0.1\n#> 7     Big5       zh        0.1\n
Run Code Online (Sandbox Code Playgroud)\n

由reprex 包(v0.2.1)于 2019-02-11 创建

\n

要点是:如果你的字符串不是明显的非 ASCII,例如它只包含字母 az,它可能是 ASCII,也可能UTF-8,所以你会得到一个unknown,但这并不一定意味着你的显然,字符串实际上并不是 UTF-8。您可能会尝试强行强制字符串,但在此过程中您可能会破坏一些根本没有破坏的东西。根据我的经验,使用一些转换函数(例如stringi::stri_enc_toutf8变量/向量)可能完全足够,测试它是否按预期打印/工作,也许使用正则表达式过滤器来过滤可能有问题的字符(作为德国人,我们倾向于寻找\xc3\xa4\xc3\xb6\xc3\xbc\xc3\x9f)。

\n

不管怎样,如果你想深入了解细节,我建议你研究一下这个stringi及其编码函数。这个包是背后的动力stringr,它提供了更高级的接口。

\n


pet*_*ler 1

当我处理未正确编码的 UTF-8 文件时,我使用 iconv 成功地通过在 rmarkdown 笔记本中运行 bash 脚本来强制转换文件:

\n\n
iconv -c -t UTF-8 myfile.txt > Ratebeer-myfile.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

您也可以尝试此操作,其中 file 是原始文件, file-iconv 是修改后的文件:

\n\n
#iconv \xe2\x88\x92f iso\xe2\x88\x928859\xe2\x88\x921 \xe2\x88\x92t UTF\xe2\x88\x928 file.txt > file-iconv.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用以下命令验证编码:

\n\n
file -I file-iconv.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

让我知道这是否有帮助。

\n