2015-10-11 10 views
5

Non sono sicuro che si tratti di un bug o meno. Se codifico uno dei caratteri in UTF-8 prima di convertirlo in raw e viceversa, i caratteri non sono gli stessi. Ho impostato la codifica predefinita su "UTF-8" in RStudio.Codifica e raw in R

rawToChar(charToRaw(enc2utf8("vægt"))) 
[1] "vægt" 

rawToChar(charToRaw("vægt")) 
[1] "vægt" 

Ecco il mio 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  
+2

Confermato sul mio computer Windows 10 ma funziona correttamente sul mio computer Linux. –

+1

Penso che questo sia un problema di Windows. – KERO

+0

Questo è un problema che si verifica quando si utilizzano i diversi pacchetti xml. Qualcuno può spiegare perché enc2utf8 è necessario prima del charToRaw nei pacchetti xml? Non puoi parlare per conto degli autori ma voglio solo capire perché è fatto e se posso suggerire che enc2utf8 viene rimosso senza causare molti nuovi problemi. – KERO

risposta

5

Ecco la mia comprensione di base di quello che sta succedendo.

Prima alcuni fatti di codifica:

    Encoding 
character UTF-8  CP1252 
    v   76    76 
    æ   c3 a6   e6 
    g   67    67 
    t   74    74 
    Ã   c3 83   c3 
    ¦   c2 a6   a6 

Ora la meccanica:

La macchina Windows utilizza la codifica CP1252 come si può vedere dal sessionInfo uscita. Pertanto la stringa vægt nello script R è rappresentata dai byte 76 e6 67 74. Questo è confermato da charToRaw("vægt"). Se poi lo convertiamo in UTF-8, otteniamo 76 c3 a6 67 74. Il fatto che questi byte rappresentino UTF-8 è perso. Successivamente rawToChar() converte questi byte in una stringa, assumendo nuovamente CP1252. Dal c3 è à e a6 è ¦ in CP1252, otteniamo vægt.

Su Mac e Linux, d'altra parte, la codifica predefinita è UTF-8 in tutto e non si verificano mancate corrispondenze di codifica. Sospetto, tuttavia, che lo stesso fenomeno di Windows possa essere attivato cambiando/impostando esplicitamente la codifica utilizzata da R.

Non penso che questo sia un bug.

+0

Grazie per la spiegazione! Ora penso di capire questa linea nell'aiuto in 'rawToChar': _italic_ In entrambi i casi è possibile creare un risultato che non è valido in una locale multibyte, ad es. uno con UTF-8. _italico_ Non c'è molto che posso fare al riguardo, perché non posso modificare le impostazioni locali in Windows solo per R (è un computer che ho ricevuto dal lavoro, quindi non posso cambiare la lingua)? – KERO