我有一个损坏的文件,其中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)
没有任何事情发生......我想问题就是角色"Ã"没有被正确识别.你有解决我的问题的方法吗?
这是一个编码问题。您也许可以修复它,但是没有文件就很难知道。 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
,您将永远无法做只要是正确的替换。