我正在从旧的专有数据库中读取数据。不幸的是,我Encoding(mychar_vector)
返回"unknown"
,结果(仅限某些字符串)。不幸的是我在一个封闭的源c hli
(宿主语言界面)周围使用了一个包装器,所以我可能做的不多 - 如果是这样的话我很高兴在这里被证明是错的......
然而,除了我必须做的一些替换之外,查看字符串向量(使用gsub
查看我的related question)字符串看起来没问题。我希望重新获得对编码的控制权。有没有办法强制将编码设置为UTF-8?我试着
Encoding(mychar_vector) <- "UTF-8"
# or
mychar_vector <- enc2utf8(mychar_vector)
但这一切都没有成功。检查后立即得到"unknown"
。还研究了iconv
,但显然没有办法从“未知”转换为UTF-8,因为没有映射。
有没有办法告诉R,只涉及UTF-8字符,因此编码可以设置为UTF-8。请注意,向量的某些元素已经是UTF-8。
答案 0 :(得分:0)
当我处理不正确UTF-8编码的文件时,我使用iconv非常成功,只需在我的rmarkdown笔记本中运行bash脚本即可强制转换文件:
iconv -c -t UTF-8 myfile.txt > Ratebeer-myfile.txt
您也可以尝试使用file作为原始文件,file-iconv是修改后的文件:
#iconv −f iso−8859−1 −t UTF−8 file.txt > file-iconv.txt
使用以下命令验证编码:
file -I file-iconv.txt
如果这有帮助,请告诉我。
答案 1 :(得分:0)
如果您可以以某种方式查询数据源以返回分隔的类似表的输入,而不是字符串,则可以使用read.table。它允许显式编码参数。这种常见用法效果很好。:
read.table(filesource, header = TRUE, stringsAsFactors = FALSE, encoding = "UTF-8")
答案 2 :(得分:0)
我也已经陷入编码困境,我了解到的重要一件事是"unknown"
编码不一定意味着它不是UTF-8。还是不好。或某些需要修复的东西。
以下是一些示例:
# Some string that might be UTF-8 or just some ASCII (but created in UTF-8 editor/environment)
ambiguous <- "wat"
Encoding(ambiguous)
#> [1] "unknown"
# Forced coercion to UTF-8 via stringi
ambiguous <- stringi::stri_enc_toutf8("wat", is_unknown_8bit = TRUE)
# Still ambiguous
Encoding(ambiguous)
#> [1] "unknown"
# Some pretty-sure-not-ASCII string
totallygermanic <- "wät"
# It's UTF-8 because that's what my RStudio and every other part of my env is set to
Encoding(totallygermanic)
#> [1] "UTF-8"
# Let's force it to be unknowm
Encoding(totallygermanic) <- "unknown"
# Still prints ok
totallygermanic
#> [1] "wät"
# What's its encoding now?
Encoding(totallygermanic)
#> [1] "unknown"
# Converting it to UTF-8 still prints ok
stringi::stri_enc_toutf8(totallygermanic)
#> [1] "wät"
# So the converted string is UTF-8, right? No.
Encoding(stringi::stri_enc_toutf8(totallygermanic))
#> [1] "unknown"
# Maybe we should just guess?
stringi::stri_enc_detect("wat")
#> [[1]]
#> Encoding Language Confidence
#> 1 ISO-8859-1 en 0.75
#> 2 ISO-8859-2 ro 0.75
#> 3 UTF-8 0.15
stringi::stri_enc_detect("wät")
#> [[1]]
#> Encoding Language Confidence
#> 1 UTF-8 0.8
#> 2 UTF-16BE 0.1
#> 3 UTF-16LE 0.1
#> 4 GB18030 zh 0.1
#> 5 EUC-JP ja 0.1
#> 6 EUC-KR ko 0.1
#> 7 Big5 zh 0.1
由reprex package(v0.2.1)于2019-02-11创建
要点是:如果您的字符串不是显然非ASCII,例如它仅包含字母az,可以为ASCII,或者可以为UTF-8,因此您会得到一个unknown
,但这不必表示您的字符串实际上不是UTF-8。您可能会强制强制字符串,从而在您可能破坏完全没有破坏的内容的过程中出错。以我的经验,在变量/向量上使用诸如stringi::stri_enc_toutf8
之类的转换函数,测试其是否按预期方式打印/工作,也许对可能存在问题的字符使用正则表达式过滤器(例如,德语)我们倾向于寻找äöüß
)。
顺便说一句,如果您想了解更多细节,我建议您研究一下stringi
package及其编码功能。该软件包是stringr
背后的强大力量,它提供了更高级的界面。