2013-07-20 37 views
8

Sau khi đọc tất cả về iconvEncoding, tôi vẫn còn bối rối.Chuyển đổi chuỗi u thoát Unicode thành ASCII

Tôi đang tìm nguồn gốc web page Tôi có một chuỗi trông giống như sau: 'pretty\u003D\u003Ebig' (được hiển thị trong bảng điều khiển R dưới dạng 'pretty\\\u003D\\\u003Ebig'). Tôi muốn chuyển đổi điều này thành chuỗi ASCII, phải là 'pretty=>big'.

Nhiều cách đơn giản, nếu tôi đặt

x <- 'pretty\\u003D\\u003Ebig' 

Làm thế nào để thực hiện một chuyển đổi trên x để mang pretty=>big?

Mọi đề xuất?

+0

Mã bạn đang sử dụng có thể là cần thiết để tái tạo vấn đề này. –

Trả lời

7

Sử dụng phân tích cú pháp, nhưng đừng đánh giá kết quả:

x1 <- 'pretty\\u003D\\u003Ebig' 
x2 <- parse(text = paste0("'", x1, "'")) 
x3 <- x2[[1]] 
x3 
# [1] "pretty=>big" 
is.character(x3) 
# [1] TRUE 
length(x3) 
# [1] 1 
+1

'as.character (x2)' sẽ hoạt động quá và sẽ được vector hóa (ví dụ: 'as.character (phân tích cú pháp (văn bản = dán0 (" '", đại diện (x1,3),"' ")))'). Ngoài ra 'shQuote (x1)' có thể có ích thay vì 'paste0'. – Marek

1

Tôi thông cảm; Tôi đã đấu tranh với R và unicode văn bản trong quá khứ và không phải lúc nào cũng thành công. Nếu dữ liệu của bạn trong x thì trước tiên cố gắng thay thế một toàn cầu, một cái gì đó như thế này:

x <- gsub("\u003D", "=>", x) 

đôi khi tôi sử dụng một cấu trúc giống như

lapply(x, utf8ToInt) 

để xem nơi các điểm mã cao là ví dụ bất cứ điều gì trên 150. Điều này giúp tôi xác định vị trí các vấn đề gây ra bởi không gian không phá vỡ, ví dụ, mà dường như bật lên mỗi bây giờ và một lần nữa.

+1

Tôi cần phải sử dụng 'x <- gsub (" \ u003D \ u003E "," => ", x)' nhưng tôi không muốn đề cập đến mọi trường hợp có thể xảy ra. Lưu ý rằng 'lapply (x, utf8ToInt)' sản lượng '112 114 101 116 116 121 92 48 48 51 68 92 117 48 48 51 69 98 105 103' để chúng là tất cả các điểm mã thấp! Tôi chỉ cần hoàn tác \ u thoát! – seancarmody

+0

Ah, điểm tốt, tôi thường giải quyết các kịch bản châu Á có năng suất cao điểm, điều này rõ ràng là một chút khác nhau. – SlowLearner

0
> iconv('pretty\u003D\u003Ebig', "UTF-8", "ASCII") 
[1] "pretty=>big" 

nhưng bạn dường như có một lối thoát thêm

+0

Chính xác! Tôi không thể giúp thoát thêm: đó là điều mà [webbooks] (http://books.google.com/ngrams/graph?content=pretty%3D%3Ebig&year_start=1800&year_end=2000&corpus=15) trả về (nhấp vào , xem nguồn và cuộn xuống dữ liệu). – seancarmody

+0

Đó cũng là hướng dẫn để so sánh 'cat ('pretty \ u003D \ u003Ebig')' và 'cat ('pretty \\ u003D \\ u003Ebig')'. Có sự khác biệt lớn giữa các lần thoát trong dữ liệu bạn nhập vào bảng điều khiển và thoát trong dữ liệu bạn có được thông qua các phương tiện khác. – seancarmody

+0

bạn có đang sử dụng các cửa sổ không? – user1609452

0

Bí quyết ở đây là '\\u003D' thực sự là 6 ký tự khi bạn muốn '\u003D' mà chỉ là một nhân vật. Bí quyết nữa là để phù hợp với những dấu xồ nguợc bạn cần phải sử dụng những dấu xồ nguợc gấp đôi đã trốn thoát trong mẫu:

gsub("\\\\u003D\\\\u003E", "\u003D\u003E", x) 
#[1] "pretty=>big" 

Để thay thế nhiều ký tự với một ký tự bạn cần phải nhắm mục tiêu toàn bộ mẫu. Bạn không thể đơn giản xóa dấu gạch chéo ngược. (Vì bạn đã cho biết đây là vấn đề chung hơn, tôi nghĩ câu trả lời có thể nằm trong các sửa đổi đối với phương thức chưa được mô tả của bạn để tải xuống văn bản này.)

Khi tôi tải các chức năng và phụ thuộc, mã này hoạt động:

> freq <- ngram(c('pretty\u003D\u003Ebig'), year_start = 1950) 
> 
> str(freq) 
'data.frame': 59 obs. of 4 variables: 
$ Year  : num 1950 1951 1952 1953 1954 ... 
$ Phrase : Factor w/ 1 level "pretty=>big": 1 1 1 1 1 1 1 1 1 1 ... 
$ Frequency: num 1.52e-10 6.03e-10 5.98e-10 8.27e-10 8.13e-10 ... 
$ Corpus : Factor w/ 1 level "eng_2012": 1 1 1 1 1 1 1 1 1 1 ... 

(vì vậy, tôi đoán tôi vẫn không rõ ràng về các trường hợp sử dụng.)

+0

Chi tiết đẫm máu của nơi tải xuống đang diễn ra là [ở đây] (https://github.com/seancarmody/ngramr/blob/master/R/ngram.R), nhưng chỉ làm việc với 'x <- 'pretty \\ u003D \\ u003Ebig'' cho phép bạn tạo lại vấn đề. – seancarmody

+0

Tôi cần xác định nguồn cho nhiều lỗi chức năng bị thiếu và nạp RCurl, stringr, httr và RJSONIO trước khi chạy. Tôi đã thử với một số mã nhận xét của bạn ở trên các chức năng đó nhưng tôi vẫn không chắc tôi có một trường hợp thử nghiệm để làm việc hay không. –

+0

Cuộc gọi có liên quan phát sinh lỗi là 'ngram (" pretty => big ")', nhưng tham chiếu đến gói này là chỉ hiển thị động lực: quá nhiều đối với ví dụ tái sản xuất! – seancarmody

1

Một sử dụng cho eval(parse)!

eval(parse(text=paste0("'", x, "'"))) 

Điều này có những vấn đề riêng của khóa học, chẳng hạn như phải tự thoát khỏi bất kỳ dấu ngoặc kép nào trong chuỗi. Nhưng nó sẽ làm việc cho bất kỳ chuỗi Unicode hợp lệ có thể xuất hiện.

+0

May mắn thay, với các trích dẫn [nguồn của chuỗi] (x <- 'pretty \\ u003D \\ u003Ebig') đã được khử trùng. – seancarmody

+0

Tôi đã kết hợp bản sửa lỗi vào [gói ngram] của tôi (https://github.com/seancarmody/ngramr). Cảm ơn! – seancarmody

+0

Tôi đã hỏi về việc khử trùng ở đây: http://stackoverflow.com/questions/17770093/sanitising-strings-in-r –

3

Mặc dù tôi đã chấp nhận câu trả lời của Hong ooi, tôi không thể không suy nghĩ parseeval là một giải pháp nặng. Ngoài ra, như đã chỉ ra, nó không an toàn, mặc dù cho ứng dụng của tôi tôi có thể tự tin rằng tôi sẽ không nhận được báo giá nguy hiểm.

Vì vậy, tôi đã nghĩ ra một sự thay thế, hơi tàn bạo, cách tiếp cận:

udecode <- function(string){ 
    uconv <- function(chars) intToUtf8(strtoi(chars, 16L)) 
    ufilter <- function(string) { 
    if (substr(string, 1, 1)=="|") uconv(substr(string, 2, 5)) else string 
    } 
    string <- gsub("\\\\u([[:xdigit:]]{4})", ",|\\1,", string, perl=TRUE) 
    strings <- unlist(strsplit(string, ",")) 
    string <- paste(sapply(strings, ufilter), collapse='') 
    return(string) 
} 

Bất kỳ đơn giản hóa hoan nghênh!

3

Với gói stringi:

> x <- 'pretty\\u003D\\u003Ebig' 
> stringi::stri_unescape_unicode(x) 
[1] "pretty=>big" 
Các vấn đề liên quan