在R中编码和生成

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)

Whi*_*ing 7

这是我对正在发生的事情的基本了解.

首先是一些编码事实:

                  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相同的现象.

我不认为这是一个错误.