R: преобразование кириллического Юникода в латинский текст

#r #unicode #cyrillic #stringi

#r #юникод #кириллица #stringi

Вопрос:

У меня есть некоторый текст в юникоде, собранный с веб-сайта, который написан кириллицей с использованием R selenium, язык сербский.

Образец текста в юникоде находится в этой форме:

<U 041A><U 0440><U 0430><U 0433><U 0443><U 0458><U 0435><U 0432><U 0430><U 0446> <U 0410><U 0421>

Далее, у меня есть текст, собранный в виде таблицы. Где приведенный выше текст в юникоде будет представлять собой одну строку, в то время как другие столбцы / строки могут быть уже в латинском алфавите.

Я занимался этим часами и пытаюсь:

  1. Либо преобразовать юникод в кириллицу, либо
  2. Преобразование юникода непосредственно в латинский алфавит

Моя последняя попытка заключалась в использовании пакета stringi, но не сработала: stringi::stri_trans_general(Table_save,"latin-ascii")

Любой совет был бы очень признателен! Спасибо

Комментарии:

1. после этого та же проблема!

Ответ №1:

Я надеюсь, что мое решение поможет. Во-первых, как вы, вероятно, знаете, текст U 041A представляет собой шестнадцатеричный код. Я хочу подчеркнуть это, потому что я думаю, что это плохая идея конвертировать эти коды в кириллицу. Я думаю, что лучше всего работать с вашим текстом через шестнадцатеричные юникоды. Другими словами, при работе с текстом учитывайте юникоды букв, а не буквы как таковые.

Таким образом, будет проще выполнять регулярные выражения и другие преобразования в вашем тексте. Если вы хотите прочитать свой текст как кириллицу, вам просто нужно попросить R интерпретировать ваш вектор юникодов как текст в формате UTF-8 с помощью функции, подобной intToUtf8() .

Первое, что вам нужно сделать, это отделить каждое кириллическое слово. Итак, вы хотите определить каждый пробел в вашем тексте и заменить его соответствующим юникодом (да, даже пробелы имеют юникод). После этого вам нужно отделить каждую букву (раньше я отделял каждое слово, теперь я хочу отделить каждую букву или символ, который образует вашу фразу).

Далее мне нужно исключить другие метасимволы (> и ) и оставить только шестнадцатеричный код в каждом элементе vector a . После этого я просто заменяю каждую букву U на 0x, чтобы выделить только шестнадцатеричную часть Юникода. Этот способ проще, потому что для чтения кода U041A как Юникода мне нужно вставить одну обратную косую черту (в результате U041A ) перед U, и я изо всех сил пытался это сделать. После этих шагов каждый элемент vector a представляет собой символ (или букву), который формирует вашу фразу.

 library(tibble)
library(stringr)
text <- "<U 041A><U 0440><U 0430><U 0433><U 0443><U 0458><U 0435><U 0432><U 0430><U 0446> <U 0410><U 0421>" 

a <- str_replace_all(text, " ", replacement = "<U 0020>") # replace white spaces

a <- unlist(str_split(a, "[<]"))

a <- a[-1]

  
a <- str_replace_all(a, ">", "")
  
a <- str_replace_all(a, "\ ", "")
  
a <- str_replace_all(a, "U", "0x")


intToUtf8(a)

[1] "Крагујевац АС"