我正在从旧的专有数据库中读取数据.不幸的是,我最终(仅限一些字符串)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.
我也曾陷入编码兔子洞,我学到的重要事情之一是"unknown"编码并不一定意味着它不是 UTF-8。还是不好。或者有什么需要修复的地方。
这里有些例子:
\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\nRun 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)。
不管怎样,如果你想深入了解细节,我建议你研究一下这个stringi包及其编码函数。这个包是背后的动力stringr,它提供了更高级的接口。
当我处理未正确编码的 UTF-8 文件时,我使用 iconv 成功地通过在 rmarkdown 笔记本中运行 bash 脚本来强制转换文件:
\n\niconv -c -t UTF-8 myfile.txt > Ratebeer-myfile.txt\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n使用以下命令验证编码:
\n\nfile -I file-iconv.txt\nRun Code Online (Sandbox Code Playgroud)\n\n让我知道这是否有帮助。
\n| 归档时间: |
|
| 查看次数: |
2396 次 |
| 最近记录: |