在R语言中替换不同编码的特殊字符

7

我有一个损坏的文件,其中Windows特殊字符已被其UTF-8“等效字符”替换。我尝试编写一个函数,可以基于 这个表格 替换特殊字符:

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)

什么都没有发生...我猜问题在于字符"Ã"没有被正确识别。你有解决我的问题的办法吗?

1个回答

8
这是一个编码问题。你可能能够解决它,但没有文件很难确定。如果无法强制使用正确的编码,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] "Á" "Í" "Ï" "Ð" "Ý" "à"

您提供的链接页面有相关内容,详细说明了问题所在:编码问题:双重转换
以下是症状: 在这种双重转换中,大多数字符都显示正确。仅拥有第二个UTF-8字节为0x81、0x8D、0x8F、0x90和0x9D的字符失败。在Windows-1252中,Unicode代码点为U+00C1、U+00CD、U+00CF、U+00D0和U+00DD的以下字符将显示问题。如果您查看I18nQA编码调试表格,您可以看到UTF-8中这些字符的第二个字节以一个未分配的Windows代码点结束。
Á Í Ï Ð Ý
“à”的情况则不同。您将其映射为“Ô,而应该是“Ã\u00A0”或“Ã\xA0”或“à”(请注意,空格不是普通空格;它是不间断的空格)。因此,在ist中解决这个问题就能处理一个字母。
至于其他字符(“Á”、“Í”、“Ï”、“Д和“Ý”),现在它们在ist中都被映射为“Ô,只要这个问题存在,您将永远无法进行适当的替换。

非常好的回答 - 谢谢!此外,您指出了一些不在我的范围内的问题(“Á”,“Í”,“Ï”,“Д和“Ý”)。这似乎是将我链接中的表格转换为Excel的结果。 - Seb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接