Конвертировать юникод в читаемую строку - PullRequest
0 голосов
/ 11 декабря 2018

Мой объект в R содержит следующий юникод, извлеченный из твиттера.

\ xe0 \ xae \ xa8 \ xe0 \ xae \ x9f \ xe0 \ xae \ xbf\ xe0 \ xae \ x95 \ xe0 \ xae \ xb0 \ xe0 \ xaf \ x8d \ xe0 \ xae \ x9a \ xe0 \ xaf \ x82 \ xe0 \ xae \ xb0 \ xe0 \ xaf \ x8d \ xe0 \ xae \ xaf \ xe0\ xae \ xbe \ xe0 \ xae \ x9a \ xe0 \ xaf \ x86 \ xe0 \ xae \ xaf \ xe0 \ xaf \ x8d \ xe0 \ xae \ xa4 \ xe0 \ xae \ x89 \ xe0 \ xae \ xa4 \ xe0 \ xae0\ xb5 \ xe0 \ xae \ xbf \ xe0 \ xae \ xae \ xe0 \ xae \ xbf \ xe0 \ xae \ x95 \ xe0 \ xae \ xae \ xe0 \ xaf \ x81 \ xe0 \ xae \ x95 \ xe0 \ xaf \ x8d\ xe0 \ XAE \ x95 \ xe0 \ XAE \ XBF \ xe0 \ XAE \ XAF \ xe0 \ XAE \ XAE \ xe0 \ XAE \ XBE \ xe0 \ XAE \ xA9 \ xe0 \ XAE \ xa4 \ xe0 \ XAF \ x81!- \ xe0 \ xae \ x9f \ xe0 \ xaf \ x86 \ xe0 \ xae \ xb2 \ xe0 \ xaf \ x8d \ xe0 \ xae \ x9f \ xe0 \ xae \ xbe \ xe0 \ xae \ xb5 \ xe0 \ xae \ xbf \xe0 \ xae \ xb2 \ xe0 \ xaf \ x8d \ xe0 \ xae \ xa8 \ xe0 \ xaf \ x86 \ xe0 \ xae \ x95 \ xe0 \ xae \ xbf \ xe0 \ xae \ xb4 \ xe0 \ xaf \ x8d \ xe0 \xae \ xa8 \ xe0 \ xaf \ x8d \ xe0 \ xae \ xa4 \ xe0 \ xae \ x9a \ xe0 \ xaf \ x80 \ xe0 \ xae \ xae \ xe0 \ xae \ xbe \ xe0 \ xae \ xa9 \ xe0 \ xaf \x8d

Мне нужно преобразовать их в удобочитаемые строки.Если я просто помещу это в строку, например,

x <- "\xe0\xae\xa8\xe0\xae\x9f\xe0\xae\xbf\xe0\xae\x95\xe0\xae\xb0\xe0\xaf\x8d \xe0\xae\x9a\xe0\xaf\x82\xe0\xae\xb0\xe0\xaf\x8d\xe0\xae\xaf\xe0\xae\xbe \xe0\xae\x9a\xe0\xaf\x86\xe0\xae\xaf\xe0\xaf\x8d\xe0\xae\xa4 \xe0\xae\x89\xe0\xae\xa4\xe0\xae\xb5\xe0\xae\xbf \xe0\xae\xae\xe0\xae\xbf\xe0\xae\x95 \xe0\xae\xae\xe0\xaf\x81\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xae\xe0\xae\xbe\xe0\xae\xa9\xe0\xae\xa4\xe0\xaf\x81!' - \xe0\xae\x9f\xe0\xaf\x86\xe0\xae\xb2\xe0\xaf\x8d\xe0\xae\x9f\xe0\xae\xbe\xe0\xae\xb5\xe0\xae\xbf\xe0\xae\xb2\xe0\xaf\x8d \xe0\xae\xa8\xe0\xaf\x86\xe0\xae\x95\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4 \xe0\xae\x9a\xe0\xaf\x80\xe0\xae\xae\xe0\xae\xbe\xe0\xae\xa9\xe0\xaf\x8d"

, это отобразится как нечитаемый беспорядок.Как я могу заставить его отображаться с использованием реальных символов?

1 Ответ

0 голосов
/ 15 декабря 2018

Когда вы присваиваете шестнадцатеричные коды, такие как \xe0\xae\xa8\xe0..., строке, R не знает, как они предназначены для интерпретации, поэтому он предполагает кодирование текущей локали на вашем компьютере.В наши дни в большинстве современных систем на основе Unix это будет UTF-8, поэтому, например, на Mac ваша строка отображается как

> x
[1] "நடிகர் சூர்யா செய்த உதவி மிக முக்கியமானது!' - டெல்டாவில் நெகிழ்ந்த சீமான்"

, что, я полагаю, является правильным отображением.Google Translate распознает его как написанный на тамильском.

Однако в Windows он отображается нечитаемо.В моей системе Windows 10 я вижу

> x
[1] "நடிகர௠சூரà¯à®¯à®¾ செயà¯à®¤ உதவி மிக à®®à¯à®•à¯à®•à®¿à®¯à®®à®¾à®©à®¤à¯!' - டெலà¯à®Ÿ

, потому что она использует кодовую страницу, соответствующую кодировке Latin1, что неправильно для этой строки.Чтобы заставить его правильно отображаться в Windows, вам нужно сообщить R, что он закодирован в UTF-8, объявив его кодировку:

Encoding(x) <- "UTF-8"

Затем он также будет отображаться правильно в Windows, что решает вашу проблему.

Для других, пытающихся сделать это, важно знать, что есть только несколько значений, которые работают таким образом.Вы можете объявить кодировку "UTF-8", "latin1", "bytes" или "unknown".«неизвестный» означает локальную кодировку на машине, «байты» означает, что она вообще не должна интерпретироваться как символы.Если ваша строка имеет другую кодировку, вам нужно использовать другой подход: преобразовать в одну из кодировок, о которых R знает.

Например, строка

x <- "\xb4\xde\xd1\xe0\xde\xd5 \xe3\xe2\xe0\xde" 

имеет русскую кодировкув ИСО 8859-5.В системе, где это была локальная кодировка, она отображалась бы правильно, а в моей - с использованием шестнадцатеричных кодов.Чтобы он отображался правильно, мне нужно преобразовать его в UTF-8, используя

y <- iconv(x, from="ISO8859-5", to="UTF-8")

. Затем он будет отображаться как [1] "Доброе утро".Вы можете увидеть полный список кодировок, которые iconv() знает об использовании iconvlist().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...