为什么我可以用iconv(my_string,“UTF-8”,“UTF-8”)清理我的字符串?

时间:2017-05-18 09:01:50

标签: r utf-8 character-encoding iconv

我正在从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 

有更好的方法吗?

0 个答案:

没有答案