Форсировать векторное кодирование символов от «неизвестного» до «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.

и двоичный поиск не работает .

Я понял, что data.tablekey состоит из: «неизвестных» и «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

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

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

Моя реверсия:

 > 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 

    Функция 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" 
    Давайте будем гением компьютера.