Подтвердить что ты не робот

Форсировать векторное кодирование символов от "неизвестного" до "UTF-8" в R

У меня проблема с несогласованным кодированием символьного вектора в 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

но без эффекта.

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

My 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   
4b9b3361

Ответ 1

Функция Encoding возвращает unknown, если символьная строка имеет метку "родной кодировки" (CP-1250 в вашем случае) или если она находится в ASCII. Чтобы различать эти два случая, вызовите:

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

Чтобы проверить, состоит ли каждая строка из допустимых последовательностей байтов UTF-8, вызовите:

all(stri_enc_isutf8(poli.dt$word))

Если это не так, то ваш файл вообще не находится в UTF-8.

Я подозреваю, что вы не проинструктировали R при чтении файла, что он действительно находится в 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 все еще жалуется на "смешанные" кодировки, вы можете транслитерировать символы, отличные от ASCII, например:

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