我正在从csv加载法语文本。它包含诸如'é','ç'等字符。
如果我用notepad ++打开它,有些行会显示正常,有些会显示'é'而不是'é',如果我把它保留为默认的ANSI编码。
如果我以UTF-8编码设置它,显示错误的法语字符现在显示正确,显示右键的那些显示错误,所以'é'现在变为'xE9'。
因此我似乎无法选择一种特定的编码来正确加载所有文件。
偶然我意识到在R中我可以通过使用从AND到UTF-8的iconv来解决某些行的问题,我想知道为什么它有效。由于R中的字符编码,我经常拉头发,所以我想更好地理解。
my_string <- substr(text_df$text[12718],91,121) # "j'ai reçu la semaine dernière"
Encoding(my_string) # "unknown"
my_string <- iconv(my_string,"UTF-8","UTF-8") # "j'ai reçu la semaine dernière"
Encoding(my_string) # "UTF-8"
注意:对于那些行来说它也可以正常工作: 编码(my_string)&lt; - “UTF-8” 正如Cath提到的那样,如果字符串不是UTF8字符串,它就不会返回NA,见下文。
然而,它实际上并不适用于每一行
my_string <- substr(text_df$text[2],56,67) # "les intérêts"
iconv(my_string,"UTF-8","UTF-8") # NA
Encoding(my_string) <- "UTF-8"
my_string # "les int\xe9r\xeats"
所以对于那些我使用
的行my_string <- substr(text_df$text[2],56,67) # "les intérêts"
my_string <- iconv(my_string,"LATIN1","LATIN1") # "les intérêts"
# Encoding(my_string) <- "LATIN1" would do the same, but not return NA if the encoding isn't right so harder to control
my_string <- iconv(my_string,"LATIN1","UTF-8")
Encoding(my_string) # "UTF-8"
最后要解决这个问题,我会使用这个丑陋的脚本:
text_utf8 <- iconv(text_df$text,"UTF-8","UTF-8")
text_latin <- iconv(text_df$text,"LATIN1","LATIN1")
text_latin <- iconv(text_latin,"LATIN1","UTF-8")
any(is.na(text_utf8) & is.na(text_latin)) # FALSE so I don't need other encodings
text_df$text <- text_utf8
text_df$text[is.na(text_df$text)] <- text_latin[is.na(text_df$text)]
any(is.na(text_df$text)) # FALSE
table(Encoding(text_df$text))
#unknown UTF-8
#2727 9999
有更好的方法吗?