Làm thế nào để phát hiện mã hóa của một tập tin?


115

Trên hệ thống tệp của tôi (Windows 7) tôi có một số tệp văn bản (Đây là các tệp tập lệnh SQL, nếu có vấn đề).

Khi được mở bằng Notepad ++ , trong menu "Mã hóa", một số trong số chúng được báo cáo là có mã hóa "UCS-2 Little Endian" và một số "UTF-8 không có BOM".

Sự khác biệt ở đây là gì? Tất cả chúng dường như là các kịch bản hoàn toàn hợp lệ. Làm thế nào tôi có thể biết mã hóa tập tin có gì mà không có Notepad ++?


7
Có một cách khá đơn giản khi sử dụng Firefox. Mở tệp của bạn bằng Firefox, sau đó Xem> Mã hóa ký tự. Chi tiết tại đây .
Catherine Gasnier

sử dụng phương pháp phỏng đoán. kiểm tra encachardetcho các hệ thống POSIX.
Janus Troelsen

3
Tôi nghĩ rằng một câu trả lời thay thế là TRIAL và ERROR. iconvđặc biệt là hữu ích cho mục đích này. Về cơ bản, bạn lặp lại các chuỗi ký tự / văn bản bị hỏng thông qua các bảng mã khác nhau để xem cái nào hoạt động. Bạn thắng, khi các nhân vật không còn bị hỏng nữa. Tôi muốn trả lời ở đây, với một ví dụ lập trình. Nhưng thật không may, đó là một câu hỏi được bảo vệ.
Brandon Bertelsen

FF đang sử dụng Trình phát hiện bộ ký tự Mozilla . Một cách đơn giản khác là mở tệp bằng từ MS, nó sẽ đoán các tệp khá chính xác ngay cả đối với các loại tiền mã hóa khác nhau của Trung Quốc và Nhật Bản
phuclv

Nếu chardethoặc chardetectkhông có sẵn trên hệ thống của bạn, thì bạn có thể cài đặt gói thông qua trình quản lý gói của mình (ví dụ: apt search chardettrên ubfox / debian, gói thường được gọi python-chardethoặc python3-chardet) hoặc qua pip với pip install chardet(hoặc pip install cchardetcho phiên bản tối ưu hóa c nhanh hơn).
ccpizza

Câu trả lời:


97

Các tệp thường chỉ ra mã hóa của chúng với một tiêu đề tệp. Có rất nhiều ví dụ ở đây . Tuy nhiên, ngay cả khi đọc tiêu đề, bạn không bao giờ có thể chắc chắn mã hóa tập tin nào đang thực sự sử dụng .

Ví dụ, một tập tin với ba byte đầu tiên 0xEF,0xBB,0xBFlẽ một UTF-8 tập tin được mã hóa. Tuy nhiên, nó có thể là tệp ISO-8859-1 bắt đầu bằng các ký tự . Hoặc nó có thể là một loại tệp hoàn toàn khác.

Notepad ++ cố gắng hết sức để đoán mã hóa tập tin đang sử dụng là gì và hầu hết thời gian nó làm cho đúng. Đôi khi, nó hiểu sai - đó là lý do tại sao menu 'Mã hóa' ở đó, vì vậy bạn có thể ghi đè lên dự đoán tốt nhất của nó.

Đối với hai bảng mã bạn đề cập:

  • Các tệp "UCS-2 Little Endian" là các tệp UTF-16 (dựa trên những gì tôi hiểu từ thông tin ở đây ), vì vậy có thể bắt đầu bằng 0xFF,0xFE2 byte đầu tiên. Từ những gì tôi có thể nói, Notepad ++ mô tả chúng là "UCS-2" vì nó không hỗ trợ một số khía cạnh nhất định của UTF-16.
  • Các tệp "UTF-8 không có BOM" không có bất kỳ byte tiêu đề nào. Đó là ý nghĩa của bit "không có BOM".


2
Tại sao một tệp bắt đầu bằng BOM sẽ được tự động phát hiện là "UTF-8 không có BOM"?
Michael Borgwardt

2
Và nếu một tệp bắt đầu bằng 0xFF, 0xFE thì tệp đó sẽ được tự động phát hiện là UTF-16, không phải UCS-2. UCS-2 có thể được đoán bởi vì nó chứa chủ yếu các ký tự ASCII và do đó mọi byte khác đều là null.
Michael Borgwardt

2
Với kinh nghiệm, than ôi, siêu dữ liệu (các tiêu đề của Wikipedia) cũng có thể sai. Cơ sở dữ liệu chứa thông tin có thể bị hỏng hoặc trình tải lên ban đầu có thể đã sai. . tránh xa nguồn gốc của siêu dữ liệu, họ chỉ hiểu sai về vấn đề này)
Donal Fellows

1
Trên thực tế tôi nghĩ thật "buồn cười" rằng vấn đề mã hóa vẫn tồn tại trong năm 2014 vì không có tệp nào trên thế giới bắt đầu bằng "ï» "và tôi rất ngạc nhiên khi thấy một trang HTML được tải mã hóa sai. Đó là một vấn đề xác suất. Không thể tưởng tượng được việc chọn mã hóa sai nếu mã hóa khác sẽ tránh được các ký tự lạ .. Tìm kiếm mã hóa để tránh các ký tự lạ sẽ hoạt động trong 99,9999% trường hợp tôi đoán. Nhưng vẫn có lỗi .. Ngoài ra, đó là một thông điệp rất khó hiểu khi sử dụng ascii thay vì UTF8 để tiết kiệm dung lượng .. thật khó hiểu khi các nhà phát triển cơ sở ý tưởng này thực hiện ..
Revious 18/10/14 lúc

18

Bạn không thể. Nếu bạn có thể làm điều đó, sẽ không có quá nhiều trang web hoặc tệp văn bản với tình trạng gibberish ngẫu nhiên trên mạng. Đó là lý do tại sao mã hóa thường được gửi cùng với tải trọng dưới dạng dữ liệu meta.

Trong trường hợp không phải vậy, tất cả những gì bạn có thể làm là một trò chơi đoán thông minh, nhưng kết quả thường không rõ ràng vì cùng một chuỗi byte có thể hợp lệ trong một số mã hóa.


2
OK, sau đó, hệ điều hành Windows có lưu trữ thông tin đó (dữ liệu meta) thực sự ở đâu đó không? Trong sổ đăng ký có lẽ?
Marcel

Bạn sai rồi. Đó là mật mã - không hoàn toàn giống nhau. Có các thuật toán để đoán mã hóa Unicode.
DeadMG

6
@Marcel: Không. Đó là lý do tại sao "tệp văn bản" lại gây rắc rối cho mọi thứ trừ ASCII thuần túy.
Michael Borgwardt

cũng notepad ++ có thể làm điều này, nó có thể cho bạn biết liệu tệp văn bản có được mã hóa utf-8 hay không
user25
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.