【问题标题】:R: Convert wrong display of foreign characters into a correct encoding (double mojibake)R:将错误显示的外来字符转换为正确的编码(双mojibake)
【发布时间】:2021-06-12 19:33:03
【问题描述】:

在 R 中,我有这样的向量:

TEST <- c("BlAA¶schl, G", "ThAA¶ni, A.")

其中BlAA¶schl 应该是BlöschlThAA¶ni 应该是Thöni

整个数据集都存在类似的问题。我不知道它是怎么命名的(可能是“非 ASCII 字符”?)。

基于this response,其他人似乎已经成功尝试过这段代码:

Encoding(TEST) <- 'latin1'
stringi::stri_trans_general(TEST, 'Latin-ASCII')

但就我而言,没有任何变化。

如何将AA¶ 等字符转换为ö


编辑:关键问题似乎在于 cmets 中提到的 JosefZ 中有一个“双重mojibake”。

编辑 2:我发现这个“UTF-8 Character Debug Tool”包含actualexpected 列中的一些(不是全部)问题。此外,this "encoding repairer" on GitHub 似乎提供了我需要的东西,但它不是用 R 编写的。

【问题讨论】:

  • 这在带有 UTF-8 的 Linux 上运行良好......你的编码是什么?检查 Sys.getenv() 输出?
  • @user12256545,很有趣,谢谢。我使用 Windows。在Sys.getenv() 哪里可以找到我的“编码”?
  • 你不能,因为它看起来像一个 double mojibake 案例(此外,有些损坏),参见。以下 Python 示例:'ö'.encode('utf-8').decode('latin1').encode('utf-8').decode('latin1') 返回 'Ã\x83¶'
  • 谢谢你的解释,@JosefZ!但如果不可能的话,为什么其他用户(这里的 cmets 中)能够在 Linux 中做到这一点?
  • 这适用于我从TEST &lt;- c("Bl\xf6schl, G", "Thöni, A.") 开始。我在 Windows 上 Sys.getlocale(category = "LC_ALL") 返回 [1] "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252".and stringi::stri_escape_unicode( TEST) 返回 [1] "Bl\\u00f6schl, G" "Th\\u00f6ni, A."

标签: r encoding utf-8 stringr stringi


【解决方案1】:

可能会有更好、更高效和自动化的解决方案。

但我手动尝试了:我查看了所有“mojibakes”并手动将它们更改为gsub

TEST <- c("BlAA¶schl, G", "ThAA¶ni, A.")

TEST <- gsub("ö", "ö", TEST)
TEST <- gsub("ü", "ü", TEST)
TEST <- gsub("ž", "z", TEST)
TEST <- gsub("á", "á", TEST)
TEST <- gsub("ä", "ä", TEST)
TEST <- gsub("ć", "ć", TEST)
TEST <- gsub("Ã", "Á", TEST)
TEST <- gsub("ß", "ß", TEST)
TEST <- gsub("ã", "ã", TEST)
TEST <- gsub("é", "é", TEST)
TEST <- gsub("Ä", "č", TEST)

它有效,但如果数据集太大,总是有遗漏某些字符的风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多