2016-01-05 23 views
17

Jak mogę wykryć znaki spoza ASCII w wektorach f łańcuchów w stylu grep. Na poniższym przykładzie chciałbym wrócić c(1, 3) lub c(TRUE, FALSE, TRUE, FALSE):wykryj znaki nie ASCII w łańcuchu znaków

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

Próba:

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

Może 'stringi :: stri_enc_mark (x)'? –

+0

@ David sądzę, że to zrobi ... możesz rzucić jako odpowiedź. Może inni zobaczą z tym problem lub mają inne rozwiązania. –

+0

Dlaczego nie naprawić kodu, aby zamiast tego poprawnie obsługiwał kod Unicode? –

Odpowiedz

14

Innym możliwym sposobem jest, aby spróbować zamienić ciąg znaków ASCII i spróbować wykryć wszystkie wygenerowane znaki spoza kontroli druku które nie mogły być zamienione

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

Choć wydaje stringi ma wbudowaną funkcję tego typu rzeczy

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

Oba rozwiązania są wspaniałe. Ten jest nieco bardziej kompaktowy i może być bardziej odporny na inne kodowania, choć, rzecz jasna, niewiele wiem o kodowaniu. –

8

Dlaczego nie można wyodrębnić odpowiedni kod z 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 
Powiązane problemy