2011-02-09 52 views
7

Khi đọc tệp văn bản được tạo ở đâu đó bên ngoài ứng dụng của tôi, mã hóa được sử dụng không xác định. Ứng dụng của tôi đang sử dụng NSUnicodeStringEncoding (giống với NSUTF16StringEncoding) nên có vấn đề về đọc khác với các tệp được mã hóa UTF16.Cách đọc tệp văn bản mà không biết mã hóa

Có cách nào tôi có thể đoán mã hóa của tệp không? Ưu tiên của tôi là có thể đọc các tệp UTF8 và sau đó là tất cả các tệp khác. Đang lặp qua mã hóa có sẵn và kiểm tra xem độ dài của chuỗi đọc có lớn hơn 0 không thực sự là một cách tiếp cận tốt?

Xin cảm ơn trước.

Ignacio

+1

Có một vài câu hỏi liên quan về Stack Overflow: http://stackoverflow.com/questions/1351151/guess-encoding-when-creating-an-nsstring-from-nsdata http://stackoverflow.com/questions/4198804/how-to-reliably-guess- mã hóa-giữa-macroman-cp1252-latin1-utf-8-và-a http://stackoverflow.com/questions/373081/how-can-i-best-guess-the-encoding-when-the-bom -byte-order-mark-is-missin g (và những người khác). Bạn có thể điều chỉnh chardet thành Objective-C: http://chardet.feedparser.org/ –

Trả lời

8

tài liệu của Apple có một số hướng dẫn về cách thức tiến hành: String Programming Guide: Reading data with an unknown encoding:

Nếu bạn buộc phải đoán mã hóa (và lưu ý rằng trong trường hợp không thông tin rõ ràng, đó là một đoán):

  1. Hãy thử stringWithContentsOfFile:usedEncoding:error: hoặc initWithContentsOfFile:usedEncoding:error: (hoặc tương đương dựa trên URL). Những phương pháp này cố gắng xác định mã hóa của tài nguyên và nếu thành công trở lại bằng tham chiếu, mã hóa được sử dụng.

  2. Nếu (1) không thành công, hãy thử đọc tài nguyên bằng cách chỉ định UTF-8 làm mã hóa.

  3. Nếu (2) không thành công, hãy thử mã hóa kế thừa thích hợp. "Thích hợp" ở đây phụ thuộc một chút vào hoàn cảnh; nó có thể là mã hóa chuỗi C mặc định, nó có thể là ISO hoặc Windows Latin 1, hoặc một cái gì đó khác, tùy thuộc vào nơi dữ liệu của bạn đến từ đâu.

1

Nếu tập tin được xây dựng đúng cách bạn có thể đọc bốn byte đầu tiên và xem nếu nó là một BOM (Byte Order Mark):

http://en.wikipedia.org/wiki/Byte-order_mark

+0

Không hữu ích lắm. Điều đó chỉ cho bạn biết endianess của một bảng mã Unicode. – Raedwald

+0

Nó cũng cho bạn biết mã hóa: UTF-8, UTF-16 (BE), UTF-16 (LE), UTF-32 (BE), UTF-32 (LE), UTF-7, UTF-EBCDIC, v.v. –

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