2010-11-16 12 views
29

Tôi đang sử dụng mã này cho thêm từ Ba Tư vào một tập tin csv qua OpenCSV:thiết lập một UTF-8 trong java và csv tập tin

String[] entries="\u0645 \u062E\u062F\u0627".split("#"); 
try{ 
    CSVWriter writer=new CSVWriter(new OutputStreamWriter(new FileOutputStream("C:\\test.csv"), "UTF-8")); 

    writer.writeNext(entries); 
    writer.close(); 
} 
catch(IOException ioe){ 
    ioe.printStackTrace(); 
} 

Khi tôi mở dẫn đến tập tin csv, trong Excel, nó chứa "कỶờịỆ". Các chương trình khác như notepad.exe không có vấn đề này, nhưng tất cả người dùng của tôi đang sử dụng MS Excel.

Thay thế OpenCSV bằng SuperCSV không giải quyết được sự cố này.

Khi tôi nhập chữ Hán vào tệp csv theo cách thủ công, tôi không gặp bất kỳ sự cố nào.

+0

Chắc chắn là bản sao chính xác. Tôi chỉ cố gắng vấn đề này với các giải pháp từ liên kết ở trên (sử dụng một BOM để làm cho Excel đọc trong UTF-8) và nó giải quyết vấn đề này. Ngoài ra, dường như sử dụng UTF-16 hoạt động tốt để buộc Excel đọc CSV không phải trong ASCII. –

+0

Có một liên kết hữu ích tương tự như bài đăng của AlexR! http://weblogs.java.net/blog/joconner/archive/2010/03/24/writing-csv-files-utf-8-excel – Hamedz

Trả lời

8

Thật không may, CSV là một định dạng rất đặc biệt, không có siêu dữ liệu và không có tiêu chuẩn thực sự yêu cầu mã hóa linh hoạt. Miễn là bạn sử dụng CSV, bạn không thể sử dụng một cách đáng tin cậy bất kỳ ký tự nào bên ngoài ASCII.

lựa chọn thay thế của bạn:

  • Viết thư cho XML (mà không có siêu dữ liệu mã hóa nếu bạn làm điều đó đúng) và có những người sử dụng import the XML vào Excel.
  • Sử dụng Apache POI để tạo tài liệu Excel thực tế.
+0

XML và POI là tốt nhưng CSV cũng hoạt động. Xin vui lòng xem bình luận của tôi. Tôi quản lý để tạo tập tin CSV có chứa các ký hiệu unicode và có thể được mở bằng MS excel. – AlexR

+1

@AlexR: Điều đó có thể có hoặc không hoạt động đối với bất kỳ phiên bản Excel hoặc chương trình nào khác hoặc có thể khiến tệp bị từ chối là không hợp lệ hoặc đặt một số ký tự giả vào ô đầu tiên. Hành vi của chương trình của bạn không nên dựa vào các tính năng không có giấy tờ. –

3

Excel không sử dụng UTF8 để mở tệp CSV. Đó là một vấn đề đã biết. Mã hóa thực tế được sử dụng tùy thuộc vào cài đặt ngôn ngữ của Microsoft Windows. Với một lcoale Đức ví dụ Excel sẽ mở một tệp CSV với CP1252.

Bạn có thể tạo tệp Excel chứa một số ký tự ba tư và lưu nó dưới dạng tệp CSV. Sau đó viết một chương trình Java nhỏ để đọc tệp này và kiểm tra một số mã hóa phổ biến. Đó là cách tôi đã sử dụng để tìm ra mã hóa chính xác cho các ngôn ngữ tiếng Đức trong các tệp CSV.

+2

Thật không may là nó sai. Tôi quản lý để tạo tập tin CSV với các ký hiệu unicode có thể được mở bằng excel. Xem nhận xét của tôi sau – AlexR

89

Tôi đã dành thời gian nhưng tìm ra giải pháp cho vấn đề của bạn.

Trước tiên, tôi mở notepad và viết dòng sau: שלום, hello, привет Sau đó, tôi đã lưu nó dưới dạng tệp he-en-ru.csv sử dụng UTF-8. Sau đó, tôi mở nó với MS excel và mọi thứ hoạt động tốt.

Bây giờ, tôi đã viết một chương trình java đơn giản mà in dòng này để nộp như sau:

PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); 
    w.print(line); 
    w.flush(); 
    w.close(); 

Khi tôi mở tập tin này bằng excel tôi thấy "gibrish."

Sau đó, tôi đã cố gắng để đọc nội dung của 2 file và (như dự kiến) thấy rằng tập tin được tạo ra bởi notepad chứa 3 byte tiền tố:

239 EF 
    187 BB 
    191 BF 

Vì vậy, tôi sửa đổi mã của tôi để in tiền tố này đầu tiên và văn bản sau đó:

String line = "שלום, hello, привет"; 
    OutputStream os = new FileOutputStream("c:/temp/j.csv"); 
    os.write(239); 
    os.write(187); 
    os.write(191); 

    PrintWriter w = new PrintWriter(new OutputStreamWriter(os, "UTF-8")); 

    w.print(line); 
    w.flush(); 
    w.close(); 

Và nó đã hoạt động! Tôi mở tập tin bằng cách sử dụng excel và thấy văn bản như tôi mong đợi.

Dòng dưới cùng: viết 3 byte này trước khi viết nội dung. Tiền tố này cho biết nội dung nằm trong 'UTF-8 với BOM' (nếu không thì chỉ là 'UTF-8 không có BOM').

+3

http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 – Arjan

+0

Cảm ơn bạn đã mô tả khoa học. Điều cần biết ... – AlexR

+0

Bạn đã sử dụng phiên bản Microsoft Excel nào cho thử nghiệm của mình? – chkal