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

Mar*_*ras 47 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唯一案例的性能.

和二进制搜索不起作用.

我意识到,我的data.table- key列包括两个:"未知"和"UTF-8"编码类型:

> table(Encoding(poli.dt$word))
unknown   UTF-8 
2061312 2739122 
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法转换此列(在创建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  
Run Code Online (Sandbox Code Playgroud)

我的会话信息:

> 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   
Run Code Online (Sandbox Code Playgroud)

gag*_*ews 47

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

library(stringi)
stri_enc_mark(poli.dt$word)
Run Code Online (Sandbox Code Playgroud)

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

all(stri_enc_isutf8(poli.dt$word))
Run Code Online (Sandbox Code Playgroud)

如果不是这样,那么您的文件根本不是UTF-8.

我怀疑你在读取文件时没有指示R它确实是UTF-8(它应该足以查看poli.dt$word验证这个语句的内容).如果我的猜测是真的,请尝试:

read.csv2(file("filename", encoding="UTF-8"))
Run Code Online (Sandbox Code Playgroud)

要么

poli.dt$word <- stri_encode(poli.dt$word, "", "UTF-8") # re-mark encodings
Run Code Online (Sandbox Code Playgroud)

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

stri_trans_general("Za?ó?? g??l? ja??", "Latin-ASCII")
## [1] "Zazolc gesla jazn"
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用。我有一个字符向量 x,这样 `all(stri_enc_isutf8(x)` 返回 `TRUE`,而 `Encoding(x)` 返回“unknown”,但是 `x &lt;- stri_encode(x, "", "UTF-8 "); Encoding(x)` 返回 "unknown"。类似的 `Encoding(x) &lt;- "UTF-8"; Encoding(x)` 返回 "unknown" (3认同)
  • `stri_encode(str, from="", to = "UTF-8")` 似乎对我不起作用,对象使用 `stri_enc_mark()` 返回带有 `Encoding()` 或 "ASCII" 的“unknown”,不是“UTF-8” (2认同)

Eli*_*sEU 6

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

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

尝试上述某些方法,没有任何效果。问题已得到很好的描述:“无法将ASCII与UTF-8区别开,即使将其设置,该位也不会停留”

一个好的解决方法是“将data.frame导出到CSV临时文件,然后使用data.table :: fread()重新导入,并指定Latin-1作为源编码。”

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

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")
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助。