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