2011-09-13 39 views
8

Tôi đang đọc tệp qua RJDBC từ cơ sở dữ liệu MySQL và nó hiển thị chính xác tất cả các chữ cái trong R (ví dụ: נווה שאנן). Tuy nhiên, ngay cả khi xuất khẩu bằng cách sử dụng write.csv và fileEncoding = "UTF-8", kết quả đầu ra trông giống như <U+0436>.<U+043A>. <U+041B><U+043E><U+0437><U+0435><U+043D><U+0435><U+0446> (trong trường hợp này không phải là chuỗi ở trên mà là tiếng Bungari) cho tiếng Bungari, tiếng Do Thái, tiếng Trung và vân vân. Các nhân vật đặc biệt khác như ã, ç vv làm việc tốt.Xuất UTF-8 BOM sang .csv trong R

Tôi nghi ngờ điều này là vì UTF-8 BOM nhưng tôi đã không tìm thấy một giải pháp trên mạng

OS của tôi là một Windows7 Đức.

chỉnh sửa: Tôi cố gắng

con<-file("file.csv",encoding="UTF-8") 
write.csv(x,con,row.names=FALSE) 

và (afaik) tương đương write.csv(x, file="file.csv",fileEncoding="UTF-8",row.names=FALSE).

+2

Bạn có nói rằng khi bạn mở tệp đã xuất, bạn thấy "U + 0436" thay vì "ж"? Nếu đó không phải là vấn đề BOM, chỉ là vấn đề về các điểm mã Unicode không được mã hóa thành mã hóa UTF, nhưng đầu ra là các điểm mã. Có thể chỉ cho chúng tôi một số mã như thế nào chính xác bạn đang xuất khẩu các tập tin? – deceze

+0

Tôi đã thêm thông tin về cách tôi xuất tệp. Và có, tôi thấy "" thay vì "ж" –

+1

Xem "" trong tệp không rõ ràng (thậm chí có thể có nghĩa là các ký tự đó thực sự được gạch chân trong tệp đó hoặc trình chỉnh sửa của bạn không thể hiển thị chúng). Bạn có thể viết cho chúng tôi "ж" trong một tệp và cho chúng tôi biết giá trị hex của tất cả các ký tự mà tệp được tạo chứa (mở nó trong trình chỉnh sửa hex); HOẶC cung cấp cho chúng tôi mã để tạo lại vấn đề của bạn (tất nhiên chúng tôi không có DB của bạn, vì vậy hãy tạo một vectơ với dữ liệu mẫu). –

Trả lời

5

Trên trang trợ giúp tới Encoding (help("Encoding")), bạn có thể đọc về mã hóa đặc biệt - bytes.

Sử dụng này, tôi đã có thể tạo ra file csv bởi:

v <- "נווה שאנן" 
X <- data.frame(v1=rep(v,3), v2=LETTERS[1:3], v3=0, stringsAsFactors=FALSE) 

Encoding(X$v1) <- "bytes" 
write.csv(X, "test.csv", row.names=FALSE) 

chăm sóc mất khoảng chênh lệch giữa factorcharacter. Các công việc sau đây sẽ hoạt động:

id_characters <- which(sapply(X, 
    function(x) is.character(x) && Encoding(x)=="UTF-8")) 
for (i in id_characters) Encoding(X[[i]]) <- "bytes" 

id_factors <- which(sapply(X, 
    function(x) is.factor(x) && Encoding(levels(x))=="UTF-8")) 
for (i in id_factors) Encoding(levels(X[[i]])) <- "bytes" 

write.csv(X, "test.csv", row.names=FALSE) 
2

Câu trả lời được chấp nhận không giúp tôi trong một ứng dụng tương tự (R 3.1 trong Windows, trong khi tôi đang cố gắng mở tệp trong Excel). Dù sao, dựa trên một phần của tập tin tài liệu:

Nếu một BOM được yêu cầu (nó không được khuyến khích) khi viết nó nên được viết một cách rõ ràng, ví dụ bởi writeChar ("\ ufeff", con, eos = NULL) hoặc writeBin (as.raw (c (0xef, 0xbb, 0xbf)), binary_con)

tôi đã đưa ra những cách giải quyết như sau:

write.csv.utf8.BOM <- function(df, filename) 
{ 
    con <- file(filename, "w") 
    tryCatch({ 
    for (i in 1:ncol(df)) 
     df[,i] = iconv(df[,i], to = "UTF-8") 
    writeChar(iconv("\ufeff", to = "UTF-8"), con, eos = NULL) 
    write.csv(df, file = con) 
    },finally = {close(con)}) 
} 

Lưu ý rằng df là data.frame và tên tệp là đường dẫn đến tệp csv.