我在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
答案 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”。
复制/复制上述来源提供的示例:
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")
我希望,它将对某人有所帮助。