#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>
Далее, у меня есть текст, собранный в виде таблицы. Где приведенный выше текст в юникоде будет представлять собой одну строку, в то время как другие столбцы / строки могут быть уже в латинском алфавите.
Я занимался этим часами и пытаюсь:
- Либо преобразовать юникод в кириллицу, либо
- Преобразование юникода непосредственно в латинский алфавит
Моя последняя попытка заключалась в использовании пакета 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] "Крагујевац АС"