替换r中不同编码的特殊字符

时间:2016-01-08 15:15:48

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

我有一个损坏的文件,其中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)

没有任何反应......我想问题是角色“Ô没有被正确识别。你有解决我问题的方法吗?

1 个答案:

答案 0 :(得分:4)

这是编码问题。你可以修复它,但没有文件就很难知道。如果你不能强制进行正确的编码,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] "Á" "Í" "Ï" "Ð" "Ý" "à"

您关联的网站有一个相关的causes queries to fail,其中列出了问题所在:

  

编码问题:双误转换

     

症状

     

通过这种特殊的双重转换,大多数字符都会显示   正确。只有第二个UTF-8字节为0x81,0x8D的字符,   0x8F,0x90,0x9D失败。在Windows-1252中,以下字符用   Unicode代码点:U + 00C1,U + 00CD,U + 00CF,U + 00D0和U + 00DD   会显示问题。如果你看一下page   你可以看到UTF-8中的这些字符有第二个字节结尾   一个未分配的Windows代码点。

     

ÁÍÏÝÝ

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

对于其他字符(“Á”,“Í”,“Ï”,“Д和“Ý”),它们都被映射到ist中的“Ô,并且只要这是真的,你就永远无法做出适当的替换。