KER*_*ERO 7 r character-encoding
我不确定这是不是一个bug.如果我在转换为raw和back之前将其中一个字符编码为UTF-8,那么字符就不一样了.我在RStudio中将默认编码设置为"UTF-8".
rawToChar(charToRaw(enc2utf8("vægt")))
[1] "vægt"
rawToChar(charToRaw("vægt"))
[1] "vægt"
Run Code Online (Sandbox Code Playgroud)
这是我的sessionInfo()
R version 3.2.2 (2015-08-14)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=Danish_Denmark.1252 LC_CTYPE=Danish_Denmark.1252 LC_MONETARY=Danish_Denmark.1252
[4] LC_NUMERIC=C LC_TIME=Danish_Denmark.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggthemes_2.2.1 TTR_0.23-0 lubridate_1.3.3 tidyr_0.2.0 skm_1.0.2 ggplot2_1.0.1 dplyr_0.4.3
[8] stringr_1.0.0 dkstat_0.08
loaded via a namespace (and not attached):
[1] Rcpp_0.12.1 rstudioapi_0.3.1 magrittr_1.5 MASS_7.3-43 munsell_0.4.2 lattice_0.20-33
[7] colorspace_1.2-6 R6_2.1.1 httr_1.0.0 plyr_1.8.3 xts_0.9-7 tools_3.2.2
[13] parallel_3.2.2 grid_3.2.2 gtable_0.1.2 DBI_0.3.1 lazyeval_0.1.10 assertthat_0.1
[19] digest_0.6.8 reshape2_1.4.1 curl_0.9.3 memoise_0.2.1 labeling_0.3 stringi_0.5-5
[25] scales_0.3.0 jsonlite_0.9.17 zoo_1.7-12 proto_0.3-10
Run Code Online (Sandbox Code Playgroud)
这是我对正在发生的事情的基本了解.
首先是一些编码事实:
Encoding
character UTF-8 CP1252
v 76 76
æ c3 a6 e6
g 67 67
t 74 74
à c3 83 c3
¦ c2 a6 a6
Run Code Online (Sandbox Code Playgroud)
现在的机制:
从输出可以看出Windows机器使用CP1252编码sessionInfo.因此vægtR脚本中的字符串表示为字节76 e6 67 74.这证实了charToRaw("vægt").如果我们然后将其转换为UTF-8,我们就会得到76 c3 a6 67 74.这些字节代表UTF-8的事实已经丢失.稍后rawToChar()将这些字节转换回字符串,再次假定为CP1252.由于c3是Ã和a6是¦在CP1252,我们得到vægt.
另一方面,在Mac和Linux上,默认编码始终为UTF-8,并且不会发生编码不匹配.但是,我怀疑,通过显式更改/设置R使用的编码,可以触发与Windows相同的现象.
我不认为这是一个错误.