检测字符串中的非ascii字符

Tyl*_*ker 22 r

如何以类似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. }")
Run Code Online (Sandbox Code Playgroud)

尝试:

y <- tools::showNonASCII(x)
str(y)
p <- capture.output(tools::showNonASCII(x))
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 15

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

grepl("[[:cntrl:]]", stringi::stri_enc_toascii(x))
## [1]  TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

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

stringi::stri_enc_mark(x)
# [1] "latin1" "ASCII"  "latin1" "ASCII" 
Run Code Online (Sandbox Code Playgroud)

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

Tyl*_*ker 12

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

grepl("[^ -~]", x)
## [1]  TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

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


Rol*_*and 10

你为什么不从中提取相关代码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
Run Code Online (Sandbox Code Playgroud)


Odi*_*din 7

我想有点晚了,但它可能对下一个读者有用。

您可以找到这些功能:

  • showNonASCII(<character_vector>)
  • showNonASCIIfile(<file>)

在 R 包中tools(请参阅https://stat.ethz.ch/R-manual/R-devel/library/tools/html/showNonASCII.html)。它完全按照此处的要求执行:显示字符串或文本文件中的非 ASCII 字符。