2012-04-14 33 views
5

Có cách nào để nhận ra tệp văn bản có phải là UTF-8 bằng Python không?Làm cách nào để phát hiện xem tệp có được mã hóa bằng UTF-8 không?

Tôi thực sự muốn nhận được nếu tệp là UTF-8 hay không. Tôi không cần phải phát hiện các mã hóa khác.

+1

trùng lặp? http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of-text-file và http://stackoverflow.com/questions/2144815/how- to-know-the-encoding-of-a-file-in-python – CppLearner

+0

Tôi đã yêu cầu phát hiện UTF-8 (đúng/sai), không phải mọi mã hóa. – Riki137

+0

Bạn có thể đoán với tỷ lệ tự tin cao, trừ khi bạn biết nhiều hơn về nội dung của tệp mà bạn không thể chắc chắn. Ví dụ: loại tệp (trong trường hợp này bạn đang yêu cầu tệp văn bản). Hầu hết thời gian bạn có thể đoán. Tôi đã đi qua này một vài lần cuối năm đó là lý do tại sao :) – CppLearner

Trả lời

16

Bạn đã đề cập trong nhận xét, bạn chỉ cần phát hiện UTF-8. Nếu bạn biết cách thay thế chỉ bao gồm các mã hóa byte đơn, thì có một giải pháp thường hoạt động.

Nếu bạn biết đó là mã hóa UTF-8 hoặc mã byte đơn như latin-1, sau đó thử mở nó trước bằng UTF-8 và sau đó trong mã hóa khác. Nếu tệp chỉ chứa các ký tự ASCII, nó sẽ kết thúc bằng UTF-8 ngay cả khi nó được dùng làm mã hóa khác. Nếu nó chứa bất kỳ ký tự không phải ASCII nào, điều này hầu như luôn luôn phát hiện đúng bộ ký tự đúng giữa hai ký tự.

try: 
    # or codecs.open on Python 2 
    filedata = open(filename, encoding='UTF-8').read() 
except: 
    filedata = open(filename, encoding='other-single-byte-encoding').read() 

Tốt nhất là sử dụng chardet package from PyPI, hoặc trực tiếp hoặc thông qua UnicodeDamnit từ BeautifulSoup:

chardet 1.0.1

dò Phổ mã hóa

Phát hiện:

  • ASCII, UTF-8, UTF-16 (2 biến thể), UTF-32 (4 biến thể)
  • Big5, GB2312, EUC-TW, HZ-GB2312, ISO-2022-CN (Phồn thể và Giản Trung Quốc)
  • EUC-JP, SHIFT_JIS, ISO-2022-JP (Nhật Bản)
  • EUC-KR, ISO-2022-KR (Hàn Quốc)
  • KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859 -5, cửa sổ-1251 (Cyrillic)
  • ISO-8859-2, cửa sổ-1250 (Hungary)
  • ISO-8859-5, cửa sổ-1251 (Bulgaria)
  • windows-1252 (tiếng Anh)
  • ISO-8859-7, cửa sổ-1253 (Hy Lạp)
  • ISO-8859-8, cửa sổ-1255 (thị giác và logic Hebrew)
  • TIS-620 (Thái)

Yêu cầu Python 2.1 hoặc mới hơn

Tuy nhiên, một số tác phẩm sẽ có hiệu lực trong nhiều mã hóa, vì vậy chardet không phải là thuốc chữa bách bệnh.

+0

'chardet' quá chậm! – simon

+4

@simon: đó là lý do tại sao có ['cchardet'] (https://github.com/PyYoshi/cChardet) (lưu ý: hai' c') – jfs

2

Đáng tin cậy? Số

Nói chung, một chuỗi byte không có ý nghĩa, trừ khi bạn biết làm thế nào để giải thích nó - điều này đi cho các tập tin văn bản, mà còn số nguyên, số dấu chấm động vv

Nhưng, có những cách đoán mã hóa của một tệp, bằng cách nhìn vào dấu thứ tự byte (nếu có) và đoạn đầu tiên của tệp (để xem mã hóa nào mang lại các ký tự hợp lý nhất). Thư viện chardet là khá tốt ở đây, nhưng lưu ý nó chỉ là một heuristic, mặc dù là một trong những thay vì mạnh mẽ.

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