从"未知"强制字符向量编码到" UTF-8"在R

时间:2014-05-16 15:34:52

标签: r utf-8 character-encoding data.table

我在R.

中遇到字符向量编码不一致的问题

我从中读取表格的文本文件在Notepad++中进行了编码(通过UTF-8)(我也试过了UTF-8 without BOM。)。

我想从此文本文件中读取表格,将其转换为data.table,设置key并使用二进制搜索。当我试图这样做时,出现以下情况:

  

警告讯息:       在[.data.table(poli.dt,“żżonymi”,mult =“first”):       在连接列中检测到已知编码(latin1或UTF-8)。 data.table比较当前的字节,因此不支持   混合编码好;即使用latin1和UTF-8,或者如果任何未知编码是非ascii,其中一些已标记为已知且   别人没有。但是如果使用latin1或UTF-8,则全部使用   未知的编码是ascii,那么结果应该没问题。在未来   如果一切正常,我们会检查你并避免这个警告。该   棘手的部分是这样做而不影响ascii-only的性能   例。

和二分搜索不起作用

我意识到我的data.table - key列包含:“unknown”和“UTF-8”编码类型:

> table(Encoding(poli.dt$word))
unknown   UTF-8 
2061312 2739122 

我尝试使用:

转换此列(在创建data.table对象之前)
  • Encoding(word) <- "UTF-8"
  • word<- enc2utf8(word)

但没有效果。

我还尝试了几种不同的方法将文件读入R(设置所有有用的参数,例如encoding = "UTF-8"):

  • data.table::fread
  • utils::read.table
  • base::scan
  • colbycol::cbc.read.table

但没有效果。

=============================================== ===

我的R.version:

> R.version
           _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          0.3                         
year           2014                        
month          03                          
day            06                          
svn rev        65126                       
language       R                           
version.string R version 3.0.3 (2014-03-06)
nickname       Warm Puppy  

我的会话信息:

> sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Polish_Poland.1250  LC_CTYPE=Polish_Poland.1250                LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C                   LC_TIME=Polish_Poland.1250    

base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.2 colbycol_0.8     filehash_2.2-2   rJava_0.9-6     

loaded via a namespace (and not attached):
[1] plyr_1.8.1     Rcpp_0.11.1    reshape2_1.2.2 stringr_0.6.2  tools_3.0.3   

2 个答案:

答案 0 :(得分:45)

如果字符串具有&#34;本机编码,则Encoding函数返回unknown。标记(在您的情况下为CP-1250)或如果它是ASCII。 要区分这两种情况,请致电:

library(stringi)
stri_enc_mark(poli.dt$word)

要检查每个字符串是否是有效的UTF-8字节序列,请调用:

all(stri_enc_isutf8(poli.dt$word))

如果情况并非如此,那么您的文件绝对不是UTF-8。

我怀疑你没有在数据读取功能中强制使用UTF-8模式(尝试检查poli.dt$word的内容以验证此语句)。如果我的猜测是真的,请尝试:

read.csv2(file("filename", encoding="UTF-8"))

poli.dt$word <- stri_encode(poli.dt$word, "", "UTF-8") # re-mark encodings

如果data.table仍然抱怨&#34;混合&#34;编码时,您可能希望音译非ASCII字符,例如:

stri_trans_general("Zażółć gęślą jaźń", "Latin-ASCII")
## [1] "Zazolc gesla jazn"

答案 1 :(得分:3)

我自己找不到类似问题的解决方案。 我无法将txt文件中的未知编码字符转换回R中更易于管理的内容。

因此,由于相同的字符编码方式不同(拉丁设置中的“ X”和希腊语设置中的“ X”),因此我处于同一数据集中多次出现相同字符的情况。 但是,txt保存操作保留了编码差异---当然做得很好。

尝试上述某些方法,没有任何效果。 问题已得到很好的描述“cannot distinguish ASCII from UTF-8 and the bit will not stick even if you set it”

一个不错的解决方法是" export your data.frame to a CSV temporary file and reimport with data.table::fread() , specifying Latin-1 as source encoding."

复制/复制上述来源提供的示例:

package(data.table)
df <- your_data_frame_with_mixed_utf8_or_latin1_and_unknown_str_fields
fwrite(df,"temp.csv")
your_clean_data_table <- fread("temp.csv",encoding = "Latin-1")

我希望,它将对某人有所帮助。