R:处理表情符号并将其转换为规范形式

时间:2019-05-23 23:11:02

标签: r unicode character-encoding emoji

从一个星期前开始,我是一个可爱的暑期儿童数据科学家,对字符编码一无所知。

我正在尝试捕获文本表情符号(从各个地方提取的资源),并将每个表情符号标记为一个规范的形式,然后可以对其进行分析。

同一个表情符号可以多种形式出现。

例如(这只是我在数据中找到的编码):

\U01F9E8
<U+1F9E8>
&#129512;
<f0><9f><a7><a8>

所有参考to the same emoji.

到目前为止,我一直找不到任何R函数,程序包或其他任何函数,这些函数会让我自由地在这些编码之间进行相互转换。

utf8ToInt()可以处理某些但不能处理其他

> utf8ToInt("U+1F9E8")
[1] 85 43 49 70 57 69 56

> utf8ToInt("\U+1F9E8")
Error: '\U' used without hex digits in character string starting ""\U"

> utf8ToInt("\\U+1F9E8")
[1] 92 85 43 49 70 57 69 56

> utf8ToInt("U01F9E8")
[1] 85 48 49 70 57 69 56

> utf8ToInt("\\U01F9E8")
[1] 92 85 48 49 70 57 69 56

> utf8ToInt("\U01F9E8")
[1] 129512

只有最后一个输入给出正确答案。从理论上讲,可以使用正则表达式将这些类似的示例转换为最终的示例,但是转义字符'\'的出现确实使我陷入了困境。

最近几天我一直在坚持这一点,这确实影响了我的生产力。 我可以在R中使用技巧,功能或软件包来帮助我相互转换这些表情符号的代码吗?

1 个答案:

答案 0 :(得分:0)

用于规范化的简单文本过滤器:

› cat 56283978.txt
lorem \U01F9E8 ipsum
lorem <U+1F9E8> ipsum
lorem &#129512; ipsum
lorem <f0><9f><a7><a8> ipsum

› perl -MEncode=decode_utf8 -0777 -lpe'

    s   { < U \+ ( [[:xdigit:]]+ ) > }
        { "\\U" . substr("000000" . $1, -6) }egmsx;

    s   { & \# ( [[:digit:]]+ ) ; }
        { sprintf("\\U%06X", $1) }egmsx;

    s   { ( (?: < [[:xdigit:]]{2} > )+ ) }
        {   sprintf "\\U%06X", ord decode_utf8 join "",
            map chr hex, grep length, split /[<>]/, $1 }egmsx;

' 56283978.txt
lorem \U01F9E8 ipsum
lorem \U01F9E8 ipsum
lorem \U01F9E8 ipsum
lorem \U01F9E8 ipsum

pack提供了更多直接的解决方案,但是afaik尚未在R中实现,我想让正则表达式为您提供可移植性。