Я работаю с текстом, который содержит смайлики. Мне нужно найти их и заменить их тегами, которые можно проанализировать. Как это сделать?Перевод и картирование смайликов, закодированных как код UTF-8 в тексте
> main$text[[4]]
[1] "Spread d wrd\xf0\u009f\u0098\u008e"
> grepl("\xf0", main$text[[4]])
[1] FALSE
Я пробовал выше. Почему это не сработало? Я также пробовал iconv
в ASCII, тогда байт-кодирование, которое я получил, можно было искать с помощью grepl.
> abc<-iconv(main$text[[4]], "UTF-8", "ASCII", "byte")
> abc
[1] "Spread d wrd<f0><9f><98><8e>"
> grepl("<f0>", abc)
[1] TRUE
Я действительно не понимаю, что я здесь и что произошло. Я также не понимаю, как приведенное преобразование вводило в текст \n
символов.
Я также не знал, как их закодировать, как только они будут искупительны. Я нашел список here, но он упал (например, "U+E00E" - <ee><80><8e>
не было в списке). Существует ли полный список для такого отображения?
ADDENDUM
После многих проб и ошибок, вот что я понял. Для данных emojis есть два типа кодировок. Один из них имеет вид байтов, который доступен для поиска по grepl("\x9f", ...., useBytes=T)
, как и main$text[[4]]
, а другой (main$text[[6]]
), который можно найти как символ Юникода без useBytes=T
, то есть grepl("\ue00e",....)
. Даже то, как они отображаются в View()
и при вызове на консоли, отличается. Я совершенно смущен относительно того, что здесь происходит.
main$text[[4]]
[1] "Spread d wrd\xf0\u009f\u0098\u008e"
main[4,]
timestamp fromMe remoteResource remoteResourceDisplayName type
b 2014-08-30 02:58:58 FALSE [email protected] ABC text
text date
b Spread d wrd<f0><U+009F><U+0098><U+008E> 307114
main$text[[6]]
[1] ""
main[6,]
timestamp fromMe remoteResource remoteResourceDisplayName type text
b 2014-08-30 02:59:17 FALSE [email protected] XYZ text <U+E00E>
date
b 307114
grepl("\ue00e", main$text[[6]])
[1] TRUE
grepl("<U+E00E>", main$text[[6]])
[1] FALSE
grepl("\u009f", main$text[[4]])
[1] FALSE
grepl("\x9f", main$text[[4]])
[1] FALSE
grepl("\x9f", main$text[[4]], fixed=T)
[1] FALSE
grepl("\x9f", main$text[[4]], useBytes=T)
[1] TRUE
Карты, которые у меня есть, также отличаются. Один для байтов работает хорошо. Но другой не делает, так как я не могу создать "\ue00e"
, необходимый для поиска. Вот пример другой карты, соответствующей Softbank <U+E238>
.
emmm[11]
[1] "E238"
Это решает проблему. Я понял, что некоторые из смайликов были закодированы как их кодировка софтбанка («»), а остальные - как серия байтов, соответствующих нормальным кодировкам UTF-8 («\ xf0 \ u009f \ u0098»). Почему это должно быть? –
Еще одна проблема: у меня есть карта всех кодировок softbank. («e00e», «e051»), но чтобы сделать этот поиск доступным, мне нужно использовать 'grepl (" \ ue00e ", ...)'. Итак, как добавить «\» в строку? Я попробовал 'paste' и' gsub' с 'fixed = T', но без эффекта. –
Если у вас есть буквальная строка 'abc <-" что-то с "(буквы верхнего регистра) и" карта "со строкой' foo <- "e00e" (строчные буквы), тогда вы будете искать символ, соответствующий 'foo', выполнив что-то вроде' grepl (paste0 (""), abc, fixed = TRUE) '. Но трудно догадаться, какая именно проблема у вас есть. Возможно, вы хотели бы расширить свой вопрос более подробным примером. – mvkorpel