【问题标题】:Replacing special characters from different encodings in r替换r中不同编码的特殊字符
【发布时间】:2016-04-13 07:49:14
【问题描述】:

我有一个损坏的文件,其中 Windows 特殊字符已被其 UTF-8“等效字符”替换。我试着写了一个能够替换基于this table的特殊字符的函数:

utf2win <- function(x){
soll <- c("À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", 
  "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", 
  "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", 
  "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", 
  "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ"
)

ist <- c("À", "Ã", "Â", "Ã", "Ä", "Ã…", "Æ", "Ç", "È", "É", 
  "Ê", "Ë", "ÃŒ", "Ã", "ÃŽ", "Ã", "Ã", "Ñ", "Ã’", "Ó", "Ô", 
  "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ã", "Þ", "ß", 
  "Ã", "á", "â", "ã", "ä", "Ã¥", "æ", "ç", "è", "é", "ê", 
  "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", 
  "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ")


     for(i in 1: length(ist)){
          x <- gsub(ist[i], soll[i], x)
     }
  return(x)
}

现在进行测试

a <- "Geidorf: Grabengürtel"

utf2win(a)

什么也没发生...我想问题是字符“Ô没有被正确识别。你有解决我的问题的办法吗?

【问题讨论】:

    标签: r utf-8 character-encoding windows-1252


    【解决方案1】:

    这是一个编码问题。您也许可以修复它,但没有文件就很难知道。 readBin 是一个不错的选择,如果您不能强制进行正确的编码。以下是我发现的摘要:

    我为示例字符串尝试了iconv

    iconv(a, "UTF-8", "WINDOWS-1252")
    #[1] "Geidorf: Grabengürtel"
    

    它确实有效,但你说得对,“Ô是有问题的

    iconv("Geidorf: Grabengürtel Ã", "UTF-8", "WINDOWS-1252")
    #[1] NA
    

    我们可以看到哪些字母有问题:

    ist[is.na(iconv(ist, "UTF-8", "WINDOWS-1252"))]
    [1] "Ã" "Ã" "Ã" "Ã" "Ã" "Ã"
    
    # corresponding characters
    paste(soll[is.na(iconv(ist, "UTF-8", "WINDOWS-1252"))])
    [1] "Á" "Í" "Ï" "Ð" "Ý" "à"
    

    您链接到的网站有一个相关的page,它说明了问题所在:

    编码问题:双重错误转换

    症状

    通过这种特殊的双重转换,大多数字符显示 正确。仅具有第二个 UTF-8 字节 0x81、0x8D、 0x8F、0x90、0x9D 失败。在 Windows-1252 中,以下字符带有 Unicode 代码点:U+00C1、U+00CD、U+00CF、U+00D0 和 U+00DD 将显示问题。如果你看I18nQA Encoding Debug Table 您可以看到 UTF-8 中的这些字符的第二个字节以 未分配的 Windows 代码点之一。

    Á Í Ï Ý


    “à”是另一种情况。当它应该是“Ã\u00A0”或“Ã\xA0”或“à”时,您已将其映射到“Ô(请注意,该空间不是普通空间;它是一个不间断的空间)。因此,在 ist 中修复它会处理一封信。

    至于其他字符(“Á”、“Í”、“Ï”、“Д和“Ý”),照原样,它们都映射到ist中的“Ô,而你'只要那是真的,就永远无法进行适当的替换。

    【讨论】:

    • 优秀的回答 - 谢谢!另外,您指出了一些不在我范围内的问题(“Á”、“Í”、“Ï”、“Д和“Ý”)。这似乎是在 Excel 中转换我的链接中的表格的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多