检测字符串中的非ascii字符

时间:2016-01-05 14:15:21

标签: 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. }")

尝试:

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

4 个答案:

答案 0 :(得分: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" 

答案 1 :(得分:10)

稍后使用纯基础正则表达式来解决这个问题:

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

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

答案 2 :(得分:9)

为什么不从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

答案 3 :(得分:1)

我想有点晚了,但对以后的读者可能有用。

您可以找到以下功能:

  • showNonASCII(<character_vector>)
  • showNonASCIIfile(<file>)
tools R程序包中

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