2016-01-05 18 views
17

Làm cách nào tôi có thể phát hiện các ký tự không phải ascii trong chuỗi vectơ f theo kiểu grep như thời trang. Ví dụ dưới đây tôi muốn trả lại c(1, 3) hoặc c(TRUE, FALSE, TRUE, FALSE):phát hiện các ký tự không phải ascii trong một chuỗi

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

Attempt:

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

lẽ 'stringi :: stri_enc_mark (x) '? –

+0

@ David Tôi nghĩ rằng sẽ làm điều đó ... bạn có thể ném xuống như một câu trả lời. Có thể những người khác sẽ gặp vấn đề với nó hoặc có các giải pháp khác nhau. –

+0

Tại sao không sửa mã nên nó xử lý Unicode đúng cách? –

Trả lời

14

một cách khác có thể là cố gắng để chuyển đổi chuỗi của bạn để ASCII và cố gắng để phát hiện tất cả các tạo ký tự điều khiển in không mà không thể chuyển đổi

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

Mặc dù có vẻ như stringi có chức năng tích hợp cho loại sự kiện này quá

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

Cả hai giải pháp đều tuyệt vời. Cái này nhỏ hơn một chút và có thể mạnh mẽ hơn cho các mã hóa khác, mặc dù, phải thừa nhận rằng, tôi biết rất ít về mã hóa. –

8

Tại sao bạn không trích xuất mã có liên quan từ 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 
Các vấn đề liên quan