簡體   English   中英

替換r中不同編碼的特殊字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM