Làm cách nào để xem mã hóa nào được sử dụng trong một tệp


23

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?


piconvđể thay đổi mã hóa;)
Rinzwind

Vâng. Tôi đã thay đổi mã hóa (trong 1 tệp). Nhưng tôi có nhiều trong số này và muốn tạo ra một kịch bản nhỏ có thể điều khiển tất cả chúng và sau đó chuyển đổi nếu cần. Nhưng tôi cho rằng tôi chỉ có thể chuyển đổi tất cả chúng. Sẽ không có hại gì nếu một số đã có trong UTF-8. Đúng?
NonSt ChuẩnModel

Không thành vấn đề không :) Chỉ cần sử dụng ký tự đại diện
Rinzwind

Câu trả lời:


26

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 filelệ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.


ANSI không thực sự là tên của bất kỳ mã hóa ký tự nào. Có lẽ bạn đang nghĩ về mã thoát ANSI, có thể được biểu thị bằng mã hóa ký tự ASCII.
kasperd

@kasperd Rất có thể anh ta đang đề cập đến một trong các họ mã trang ISO 8859 hoặc Window. Đối với các nhà phát triển windows Bắc Mỹ, mã hóa ANSI thường có nghĩa là mã hóa Windows 1252 vì lý do lịch sử.
dùng1937198

Vâng, về cơ bản, ANSI là ASCII (mã 0-127) cộng với một bảng mã cụ thể theo miền địa phương (mã 128-255). Vì vậy, bạn đã đúng ...
Chỉ huy Byte


12

Một chương trình có tên filecó 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.


2
Nó có thể đoán , dù sao đi nữa.
hobbs

2
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.
Đánh dấu

Tuyệt vời 👌! Đã dành vài giờ để tìm mã hóa chính xác .sqltệp cũ của tôi và filecho tôi thấy rằng đó thực sự là một gziptệp nén!
Amirreza Nasiri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.