2012-06-27 31 views
11

Tôi có một chuỗi như sau:Viết dữ liệu không được bảo quản mã hóa

str <- "ていただけるなら" 
Encoding(str) #returns "UTF-8" 

tôi viết nó vào đĩa:

write.table(str, file="chartest", quote=F, col.names=F, row.names=F) 

Bây giờ tôi nhìn vào tập tin trong Notepadd ++, được thiết lập để UTF-8 không có mã hóa BOM và tôi nhận được điều này:

<U+3066><U+3044><U+305F><U+3060><U+3051><U+308B><U+306A><U+3089> 

Điều gì sẽ xảy ra trong quá trình này? Tôi muốn các tập tin văn bản bằng văn bản để hiển thị các chuỗi như nó xuất hiện trong R.

Đây là trên Windows 7, phiên bản R 2.15

Trả lời

1

Bạn đã cố gắng sử dụng lập luận fileEncoding?

write.table(str, file="chartest", quote=F, col.names=F, row.names=F, fileEncoding="UTF-8") 
+1

Cảm ơn đề xuất. Tuy nhiên, việc thử điều đó dường như không hoạt động. – qua

+0

OK vì vậy tại thời điểm tôi đã thử trên máy tính công việc của tôi (trên Mac OSX) và nó đã làm việc nhưng kể từ đó tôi đã thử trên máy tính ở nhà của tôi (Windows 7) và nó đã không thực sự. – plannapus

13

Đây là một "tính năng" gây phiền nhiễu của R trong Windows. Các giải pháp duy nhất mà tôi đã tìm thấy cho đến nay là tạm thời và lập trình chuyển đổi miền địa phương của bạn để một trong những thích hợp cần thiết để giải mã kịch bản của văn bản trong câu hỏi. Vì vậy, trong trường hợp trên, bạn sẽ sử dụng ngôn ngữ Nhật Bản.

## This won't work on Windows 
str <- "ていただけるなら" 
Encoding(str) #returns "UTF-8" 
write.table(str, file="c:/chartest.txt", quote=F, col.names=F, row.names=F) 
## The following should work on Windows - first grab and save your existing locale 
print(Sys.getlocale(category = "LC_CTYPE")) 
original_ctype <- Sys.getlocale(category = "LC_CTYPE") 
## Switch to the appropriate local for the script 
Sys.setlocale("LC_CTYPE","japanese") 
## Now you can write your text out and have it look as you would expect 
write.table(str, "c:/chartest2.txt", quote = FALSE, col.names = FALSE, 
      row.names = FALSE, sep = "\t", fileEncoding = "UTF-8") 
## ...and don't forget to switch back 
Sys.setlocale("LC_CTYPE", original_ctype) 

Ở trên tạo hai tệp bạn có thể thấy trong ảnh chụp màn hình này. Tệp đầu tiên hiển thị các điểm mã Unicode, mà không phải là những gì bạn muốn, trong khi tệp thứ hai hiển thị các hình tượng bạn thường mong đợi.

Japanese text

Cho đến nay không ai đã có thể giải thích cho tôi tại sao điều này xảy ra trong R. Nó không phải là một tính năng không thể tránh khỏi của Windows vì Perl, như tôi đã đề cập trong bài this, được vòng vấn đề này bằng cách nào đó.

+0

Cảm ơn bạn đã trả lời. Tiếng Nhật chỉ là một ví dụ, tôi muốn một cái gì đó phù hợp với mọi loại ngôn ngữ. Mặc dù vậy, âm thanh không hứa hẹn. – qua

+0

@qua - Vâng, tôi nghĩ rằng nó có thể là một ví dụ ngẫu nhiên cho rằng bạn đã phá vỡ chuỗi Nhật Bản ở một nơi khá kỳ lạ. Thật không may vào thời điểm này tôi không nghĩ rằng một giải pháp tốt hơn tồn tại cho R, nhưng xin vui lòng tạo câu trả lời của riêng bạn cho câu hỏi này nếu bạn tìm thấy một! Tôi đồng ý rằng nếu bạn không biết kịch bản trước, bạn có thể đấu tranh với cách tiếp cận của tôi vì (trong số các vấn đề khác) nó sẽ yêu cầu bạn đoán tại kịch bản đang được sử dụng và đơn giản là không có cách chắc chắn để thiết lập kiểu mã hóa. – SlowLearner

+0

@SlowLearner Có cách nào để liệt kê tất cả các giá trị hợp lệ cho LC_CTYPE không? – panterasBox

Các vấn đề liên quan