2016-01-05 17 views
17

Come posso rilevare caratteri non ascii in una stringa di vettore in modo simile a grep. Per esempio qui di seguito mi piacerebbe tornare c(1, 3) o c(TRUE, FALSE, TRUE, FALSE):Rileva caratteri non ascii in una stringa

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

Tentativo:

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

Forse 'stringi :: stri_enc_mark (x)'? –

+0

@David Penso che lo farà ... puoi buttare giù come risposta. Forse altri vedranno un problema con esso o avranno soluzioni diverse. –

+0

Perché non correggere il codice in modo che gestisca correttamente Unicode? –

risposta

14

un altro modo possibile è quello di cercare di convertire la stringa ASCII e il cercare di rilevare tutti i generati caratteri non stampabili di controllo, che non possono essere convertiti

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

Anche se sembra stringi ha una funzione incorporata per questo tipo di cose

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

Entrambe le soluzioni sono fantastiche. Questo è un po 'più compatto e potrebbe essere più robusto per altre codifiche, anche se, devo ammetterlo, so ben poco delle codifiche. –

8

Perché non estrarre il relativo codice da 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 
Problemi correlati