2011-10-07 40 views
7

Tôi có một tập tin được mô tả dưới Unix như:iconv định dạng unicode chưa biết đầu vào

$file xxx.csv 
xxx.csv: UTF-8 Unicode text, with very long lines 

Xem nó trong less/vi sẽ làm cho một số ký tự đặc biệt (SSA ° ...) không thể đọc được (├╝); Windows cũng sẽ không hiển thị nó; nhập nó trực tiếp vào một db sẽ chỉ thay đổi các ký tự đặc biệt thành một số ký tự đặc biệt khác (+ ä, + ñ, ...).

Tôi muốn chuyển đổi ngay bây giờ thành mã hóa "có thể đọc được mặc định" với biểu tượngv. Khi tôi cố gắng chuyển đổi nó với iconv

$iconv -f UTF-8 -t ISO-8859-1 xxx.csv > yyy.csv 
iconv: illegal input sequence at position 1234 

sử dụng UNICODE như là đầu vào và UTF-8 như đầu ra sẽ trở lại cùng một thông điệp

Tôi đoán các tập tin có phần mã hóa trong định dạng khác mà tôi không biết - làm thế nào tôi có thể tìm ra định dạng nào để chuyển đổi nó thành cái gì đó "phổ quát" có thể đọc được ...

+0

Hãy thử mở nó trong trình soạn thảo văn bản cho phép bạn thay đổi mã hóa để mở tệp. Trường hợp xấu nhất mà trình duyệt cũng sẽ làm. Sau đó, chơi xung quanh với các mã hóa có sẵn và xem những gì hiển thị các ký tự chính xác. – deceze

+0

Tôi đã thử với notepad ++ nhưng nó là 680MB và notepad ++ nói với tôi rằng nó quá lớn. –

+0

Tệp này rõ ràng không phải là UTF-8, ngay cả khi 'tệp' đoán nó. Bạn có thể cho chúng tôi thấy tám byte bắt đầu tại offset 1234, ở dạng hexdump của chúng không? –

Trả lời

4

Vấn đề là Windows không thể giải thích tập tin là UTF-8. nó sẽ đọc là ASCI và sau đó ä trở thành một giải thích ä 2 ký tự (ascii 195 164)

cố gắng để chuyển đổi nó, tôi tìm thấy một giải pháp mà làm việc cho tôi:

iconv -f UTF-8 -t WINDOWS-1252//TRANSLIT --output=outfile.csv inputfile.csv 

bây giờ tôi có thể xem ký tự đặc biệt đúng trong các biên tập viên

Đối với SQLServer compability, chuyển đổi UTF-8 sang UTF-16 sẽ làm việc tốt hơn ... chỉ là filesize phát triển khá một chút

1

Nếu bạn không chắc chắn về những loại tập tin bạn đối phó sau đó bạn có thể tìm thấy nó như sau,

file file_name 

Lệnh trên sẽ cung cấp cho bạn định dạng tệp. Sau đó, biểu tượngv có thể được sử dụng cho phù hợp. Ví dụ: nếu định dạng tệp là UTF-16 và bạn muốn chuyển đổi nó thành UTF-8 thì có thể sử dụng sau.

iconv -f UTF-16 -t UTF-8 file_name >output_file_name 

Hy vọng điều này sẽ giúp bạn hiểu rõ hơn những gì bạn đang tìm kiếm.

8

Chuyển đổi từ UTF-8 sang ISO-8859-1 chỉ hoạt động nếu văn bản UTF-8 của bạn chỉ có các ký tự có thể được thể hiện trong ISO-8859-1. Nếu đây không phải là trường hợp, bạn nên xác định những gì cần phải xảy ra với các ký tự này, hoặc bỏ qua (// IGNORE) hoặc xấp xỉ (// TRANSLIT) chúng. Hãy thử một trong hai cách sau:

iconv -f UTF-8 -t ISO-8859-1//IGNORE --output=outfile.csv inputfile.csv 
iconv -f UTF-8 -t ISO-8859-1//TRANSLIT --output=outfile.csv inputfile.csv 

Trong hầu hết các trường hợp, tôi đoán xấp xỉ là giải pháp tốt nhất, ánh xạ, ví dụ: ký tự có dấu cho các đối tác không có dấu của họ, dấu euro để EUR, v.v.

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