当前位置:  开发笔记 > 编程语言 > 正文

检测字符串中的非ascii字符

如何解决《检测字符串中的非ascii字符》经验,为你挑选了3个好方法。

如何以类似grep的方式检测向量f字符串中的非ascii字符.例如下面我想返回c(1, 3)c(TRUE, FALSE, TRUE, FALSE):

x <- c("façile test of showNonASCII(): details{", 
    "This is a good line", "This has an ümlaut in it.", "OK again. }")

尝试:

y <- tools::showNonASCII(x)
str(y)
p <- capture.output(tools::showNonASCII(x))

David Arenbu.. 15

另一种可能的方法是尝试将您的字符串转换为ASCII并尝试检测所有生成的不可打印的控制字符,这些字符无法转换

grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x))
## [1]  TRUE FALSE  TRUE FALSE

虽然它似乎stringi也有这种类型的东西的内置功能

stringi::stri_enc_mark(x)
# [1] "latin1" "ASCII"  "latin1" "ASCII" 

两种解决方案都非常棒.这个更紧凑,可能对其他编码更加健壮,但是,不可否认,我对编码知之甚少. (2认同)


Tyler Rinker.. 12

稍后使用纯基础正则表达式来实现这个简单:

grepl("[^ -~]", x)
## [1]  TRUE FALSE  TRUE FALSE

更多信息:http://www.catonmat.net/blog/my-favorite-regex/



1> David Arenbu..:

另一种可能的方法是尝试将您的字符串转换为ASCII并尝试检测所有生成的不可打印的控制字符,这些字符无法转换

grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x))
## [1]  TRUE FALSE  TRUE FALSE

虽然它似乎stringi也有这种类型的东西的内置功能

stringi::stri_enc_mark(x)
# [1] "latin1" "ASCII"  "latin1" "ASCII" 


两种解决方案都非常棒.这个更紧凑,可能对其他编码更加健壮,但是,不可否认,我对编码知之甚少.

2> Tyler Rinker..:

稍后使用纯基础正则表达式来实现这个简单:

grepl("[^ -~]", x)
## [1]  TRUE FALSE  TRUE FALSE

更多信息:http://www.catonmat.net/blog/my-favorite-regex/



3> Roland..:

你为什么不从中提取相关代码showNonASCII

x <- c("façile test of showNonASCII(): details{", 
       "This is a good line", "This has an ümlaut in it.", "OK again. }")

grepNonASCII <- function(x) {
  asc <- iconv(x, "latin1", "ASCII")
  ind <- is.na(asc) | asc != x
  which(ind)
}

grepNonASCII(x)
#[1] 1 3

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有