您的问题是您\
在代码中使用了单个字符:
text = 'text text. \U0001f600'
它真的应该是\\
:
text = 'text text. \\U0001f600'
我在使用rtweet库时也有类似的经历。
就我而言,这些推文带来了一些 Unicode 代码点,而不仅仅是表情符号,而且格式如下:"some text<U+code-point>"
. 在这种情况下,我所做的是将该代码点“转换”为它的图形表示:
library(stringi)
#I use gsub() to replace "<U+code-point>" with "\\ucode-point", the appropriate format
# And stri_unescape_unicode() to un-escape all Unicode sequences
stri_unescape_unicode(gsub("<U\\+(\\S+)>",
"\\\\u\\1", #replace by \\ucode-point
"some text with #COVID<U+30FC>19"))
#[1] "some text with #COVIDー19"
如果 Unicode 代码点没有像我的情况 (<>) 那样分隔,您应该将正则表达式从 更改"<U\\+(\\S+)>"
为"U(\\S+)"
。您应该在这里小心,因为如果在代码点之后出现空格字符,这将正常工作。如果您在代码点之前和之后都附加了单词,则它必须更具体并指示组成它的字符数,例如"U(....)"
.
您可以尝试使用字符类优化此正则表达式,或仅指定十六进制数字"U([A-Fa-f0-9]+)"
。
请注意,在 RStudio 控制台中,不会看到表情符号,您可以应用此功能,但要查看表情符号,您必须为此目的使用 R 库。但是可以看到其他字符:"#COVID<U+30FC>19"
在 RStudio 控制台中显示为"#COVIDー19"
.
编辑:"\\S+"
当有连续的 Unicode 代码点(如"<U+0001F926><U+200D><U+2642>"
. 在这种情况下,它只替换了第一次出现,我没有深入研究,我只是将我的正则表达式更改为"<U\\+([A-Fa-f0-9]+)>"
.
"[A-Fa-f0-9]"
表示十六进制数字。