在字符串中搜索unicode值

时间:2015-06-12 01:54:31

标签: r unicode grep gsub

我试图在由字符串组成的数据框中识别唯一的unicode值。我尝试过使用grep函数,但遇到以下错误

Error: '\U' used without hex digits in character string starting ""\U"

示例数据框

                     time sender                                                    message
1     2012-12-04 13:40:00      1                                            Hello handsome!
2     2012-12-04 13:40:08      1                                                 \U0001f618
3     2012-12-04 14:39:24      1                                                 \U0001f603
4     2012-12-04 16:04:25      2                                            <image omitted>
73    2012-12-05 06:02:17      1 Haha not white and blue... White with blue eyes \U0001f61c
40619 2015-05-08 10:00:58      1                                       \U0001f631\U0001f637

grep("\U", dat$messages)

数据

dat <- 
structure(list(time = c("2012-12-04 13:40:00", "2012-12-04 13:40:08", 
"2012-12-04 14:39:24", "2012-12-04 16:04:25", "2012-12-05 06:02:17", 
"2015-05-08 10:00:58"), sender = c(1L, 1L, 1L, 2L, 1L, 1L), message = c("Hello handsome!", 
"\U0001f618", "\U0001f603", "<image omitted>", "Haha not white and blue... White with blue eyes \U0001f61c", 
"\U0001f631\U0001f637")), .Names = c("time", "sender", "message"
), class = "data.frame", row.names = c("1", "2", "3", "4", "73", 
"40619"))

2 个答案:

答案 0 :(得分:5)

我假设“unicode character”你只是指非ASCII字符。根据编码,字符代码可能意味着不同的东西。 R表示具有特殊\U序列的当前编码之外的值。请注意,斜杠和字母“U”实际上都不会出现在实际数据中。这就是当适当的字形不可用时,如何将它们转义为在屏幕上打印。

例如,即使最后一条消息看起来很长,但它实际上只有两个字符长

dat$message[6]
# [1] "\U0001f631\U0001f637"
nchar(dat$message[6])
# [1] 2

您可以非常轻松地使用正则表达式查找非ASCII代码。 ASCII字符都有代码0-128(或八进制000到177)。您可以使用

查找该范围之外的值
grep("[^\001-\177]", dat$message)
# [1] 2 3 5 6

答案 1 :(得分:4)

尝试:

library(stringi)
stri_enc_isascii(dat$message)

给出了:

# [1]  TRUE FALSE FALSE  TRUE FALSE FALSE