从一个星期前开始,我是一个可爱的暑期儿童数据科学家,对字符编码一无所知。
我正在尝试捕获文本表情符号(从各个地方提取的资源),并将每个表情符号标记为一个规范的形式,然后可以对其进行分析。
同一个表情符号可以多种形式出现。
例如(这只是我在数据中找到的编码):
\U01F9E8
<U+1F9E8>
🧨
<f0><9f><a7><a8>
到目前为止,我一直找不到任何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中使用技巧,功能或软件包来帮助我相互转换这些表情符号的代码吗?
答案 0 :(得分:0)
用于规范化的简单文本过滤器:
› cat 56283978.txt
lorem \U01F9E8 ipsum
lorem <U+1F9E8> ipsum
lorem 🧨 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中实现,我想让正则表达式为您提供可移植性。