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

时间:2013-03-20 21:18:29

标签: r encoding iconv

我正在从旧的专有数据库中读取数据。不幸的是,我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。

3 个答案:

答案 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背后的强大力量,它提供了更高级的界面。