Tôi gặp một số vấn đề với các tệp phụ đề trong video omxplayer. Để giải quyết nó, tôi đã phải chuyển đổi từ mã hóa windows-1250 sang UTF-8. Câu hỏi của tôi là, làm thế nào tôi có thể xem một số tập tin cụ thể mà mã hóa được sử dụng?
Tôi gặp một số vấn đề với các tệp phụ đề trong video omxplayer. Để giải quyết nó, tôi đã phải chuyển đổi từ mã hóa windows-1250 sang UTF-8. Câu hỏi của tôi là, làm thế nào tôi có thể xem một số tập tin cụ thể mà mã hóa được sử dụng?
Câu trả lời:
Bạn thực sự không thể tự động tìm hiểu xem một tệp được viết bằng mã hóa X ban đầu.
Những gì bạn có thể dễ dàng làm là xác minh xem liệu tập tin hoàn chỉnh có thể được giải mã thành công bằng cách nào đó (nhưng không nhất thiết phải chính xác) bằng cách sử dụng một codec cụ thể. Nếu bạn tìm thấy bất kỳ byte nào không hợp lệ cho một mã hóa nhất định, thì đó phải là một thứ khác.
Vấn đề là nhiều codec tương tự nhau và có cùng "mẫu byte hợp lệ", chỉ diễn giải chúng thành các ký tự khác nhau. Ví dụ, một ä
mã hóa trong một có thể tương ứng với mã hóa é
khác hoặc ø
thứ ba. Máy tính thực sự không thể phát hiện ra cách nào để diễn giải các kết quả byte trong văn bản chính xác có thể đọc được của con người (trừ khi bạn có thể thêm từ điển cho tất cả các loại ngôn ngữ và để nó thực hiện kiểm tra chính tả ...). Bạn cũng phải biết rằng một số bộ ký tự thực sự là tập hợp con của các bộ khác, ví dụ như mã hóa ASCII là một phần của các codec được sử dụng phổ biến như một số họ ANSI hoặc UTF-8. Điều đó có nghĩa là ví dụ một văn bản được lưu dưới dạng UTF-8 chỉ chứa các ký tự Latin đơn giản, nó sẽ giống hệt với cùng một tệp được lưu dưới dạng ASCII.
Tuy nhiên, hãy quay lại giải thích những gì bạn không thể làm với những gì bạn thực sự có thể làm:
Để kiểm tra cơ bản các tệp văn bản ASCII / không phải ASCII (thường là UTF-8), bạn có thể sử dụng file
lệnh. Mặc dù vậy, nó không biết nhiều codec và nó chỉ kiểm tra vài kB đầu tiên của tệp, giả sử rằng phần còn lại sẽ không chứa bất kỳ ký tự mới nào. Mặt khác, nó cũng nhận ra các loại tệp phổ biến khác như các tập lệnh khác nhau, tài liệu HTML / XML và nhiều định dạng dữ liệu nhị phân (tất cả đều không thú vị để so sánh các tệp văn bản) và nó có thể in thông tin bổ sung cho dù có dòng quá dài hay không. loại trình tự dòng mới (ví dụ UNIX: LF, Windows: CR + LF) được sử dụng.
$ cat ascii.txt
I am an ASCII file.
Just text and numb3rs and simple punctuation...
$ cat utf8.txt
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!
$ file ascii.txt utf8.txt
ascii.txt: ASCII text
utf8.txt: UTF-8 Unicode text
Nếu điều đó là không đủ, tôi có thể cung cấp cho bạn tập lệnh Python mà tôi đã viết cho câu trả lời này ở đây , nó quét các tệp hoàn chỉnh và cố gắng giải mã chúng bằng cách sử dụng một bộ ký tự được chỉ định. Nếu nó thành công, mã hóa đó là một ứng cử viên tiềm năng. Mặt khác, nếu có bất kỳ byte nào không thể được giải mã với nó, bạn có thể xóa bộ ký tự đó khỏi danh sách của mình.
Một chương trình có tên file
có thể làm điều này. Thí dụ:
$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators
Nếu bạn quan tâm đến cách nó được thực hiện nhìn thấy src/encoding.c
.
file
đoán, và thường thì nó không phải là một thứ rất tốt. Ví dụ, trong thử nghiệm của tôi, nó đã xác định sai cả MacRoman và CP-1252 là ISO-8859, với kết quả là "š" và "ß" đã bị xáo trộn.
.sql
tệp cũ của tôi và file
cho tôi thấy rằng đó thực sự là một gzip
tệp nén!
piconv
để thay đổi mã hóa;)