Forza la codifica del vettore di caratteri da “sconosciuto” a “UTF-8” in R

Ho un problema con la codifica incoerente del vettore di caratteri in R.

Il file di testo che ho letto da una tabella è codificato (tramite Notepad++ ) in UTF-8 (ho provato anche con UTF-8 without BOM ).

Voglio leggere la tabella da questo file di testo, convertirlo in data.table , impostare una key e fare uso della ricerca binaria. Quando ho provato a farlo, è apparso il seguente:

Messaggio di avviso: in [.data.table (poli.dt, “żżonymi”, mult = “first”): una codifica conosciuta (latin1 o UTF-8) è stata rilevata in una colonna di join. data.table confronta i byte attualmente, quindi non supporta bene le codifiche miste ; cioè, usando sia latin1 che UTF-8, o se qualche codifica sconosciuta è non-ascii e alcuni di questi sono segnati noti e altri no. Ma se viene utilizzato esclusivamente Latin1 o UTF-8 e tutte le codifiche sconosciute sono ascii, il risultato dovrebbe essere ok. In futuro controlleremo per te ed eviteremo questo avviso se tutto è ok. La parte difficile sta nel fare ciò senza influire sulle prestazioni per i casi ascii-only.

e la ricerca binaria non funziona .

Mi sono reso conto che la mia colonna data.tablekey composta da entrambi: tipi di codifica “sconosciuto” e “UTF-8”:

 > table(Encoding(poli.dt$word)) unknown UTF-8 2061312 2739122 

Ho provato a convertire questa colonna (prima di creare un object data.table ) con l’uso di:

  • Encoding(word) <- "UTF-8"
  • word<- enc2utf8(word)

ma senza alcun effetto.

Ho anche provato alcuni modi diversi di leggere un file in R (impostando tutti i parametri utili, ad esempio encoding = "UTF-8" ):

  • data.table::fread
  • utils::read.table
  • base::scan
  • colbycol::cbc.read.table

ma senza alcun effetto.

==================================================

La mia 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 

Le mie informazioni sulla sessione:

 > 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 

La funzione Encoding restituisce unknown se una stringa di caratteri ha un contrassegno “encoding nativo” (CP-1250 nel tuo caso) o se è in ASCII. Per discriminare tra questi due casi, chiama:

 library(stringi) stri_enc_mark(poli.dt$word) 

Per verificare se ciascuna stringa è costituita da sequenze di byte UTF-8 valide, chiama:

 all(stri_enc_isutf8(poli.dt$word)) 

Se non è il caso, il tuo file non è affatto in UTF-8.

Sospetto che tu non abbia istruito R durante la lettura del file che è effettivamente in UTF-8 (dovrebbe bastare guardare il contenuto della poli.dt$word per verificare questa affermazione). Se la mia ipotesi è vera, prova:

 read.csv2(file("filename", encoding="UTF-8")) 

o

 poli.dt$word <- stri_encode(poli.dt$word, "", "UTF-8") # re-mark encodings 

Se data.table si lamenta ancora delle codifiche "miste", potresti voler data.table i caratteri non ASCII, ad esempio:

 stri_trans_general("Zażółć gęślą jaźń", "Latin-ASCII") ## [1] "Zazolc gesla jazn"