我尝试的解决方案是将字符串粘贴到"\U"
代码点的开头,但作为\
转义字符我做不到。但是通过一些“技巧”可以做到:我将所有代码点转换为以下结构(8 个十六进制数字):(
\\U000xxxxx
如果原始代码点中有 5 个十六进制数字,则为 000)
\\U0000xxxx
(如果原始代码点中有 4 个十六进制数字,则为 0000 )
我没有深入研究它们的含义(“填充”为 0),但事实是它们的工作方式相同,就我所尝试的而言:
message(sub_emoji("This is silly \U0001f626"))
This is silly
和
message(sub_emoji("This is silly \U1f626"))
#This is silly
我用 0 “填充”,因为我使用该函数stri_unescape_unicode()
取消转义代码点\\Uxxxxxxxx
并获得所需的结果\Uxxxxxxxx
(一\
)将其传递给sub_emoji()
此函数,仅在代码点有 8 个十六进制数字stri_unescape_unicode()
时才给出此结果(一) \
,我没有研究为什么,我只是通过乱搞才注意到这一点。我还注意到,如果它u
是小写的,它会产生另一种效果。例如:
#it does not work
stri_unescape_unicode("\\U1F926")
#[1] NA
#Warning message: .....
stri_unescape_unicode("\\U1F926\\U1F3FB")
#[1] NA
#Warning message: .....
#it works
stri_unescape_unicode("\\U0001F926")
#[1] "\U0001f926"
stri_unescape_unicode("\\U0001F926\\U0001F3FB")
# [1] "\U0001f926\U0001f3fb"
一个完整的例子:
em = stri_unescape_unicode("\\U0001f626")
message(sub_emoji(paste("This is silly", em)))
#This is silly
emc = stri_unescape_unicode("\\U0001F926\\U0001F3FB")
message(sub_emoji(paste("This is silly", emc)))
#This is silly
注意最后这个表情,有不同的肤色和发色,有ZWJ序列的效果。