[英]Replacing special characters from different encodings in r
我有一個損壞的文件,其中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
“Ô,你將永遠無法只要這是真的,做適當的替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.