Nói chung, bạn không thể. Tuy nhiên, bạn có thể nhận dạng các tệp UTF-8 một cách đáng tin cậy - nếu tệp có giá trị UTF-8, không có khả năng là mã hóa khác (trừ khi tất cả các byte nằm trong phạm vi ASCII, trong trường hợp này là “ mã hóa ASCII mở rộng, bao gồm cả UTF-8, sẽ cho bạn kết quả tương tự). Tất cả các bảng mã Unicode cũng có một tùy chọn BOM xác định chúng. Vì vậy, một cách tiếp cận hợp lý sẽ là:
- Tìm một BOM hợp lệ. Nếu có, hãy sử dụng mã hóa thích hợp.
- Nếu không, hãy thử diễn giải nó dưới dạng UTF-8. Bạn có thể làm điều này bằng cách gọi số
initWithData:data encoding:NSUTF8StringEncoding
và kiểm tra xem kết quả có phải là số không.
- Nếu điều đó không thành công, hãy sử dụng mã hóa 8 bit mặc định, chẳng hạn như
-[NSString defaultCStringEncoding]
(cung cấp dự đoán phù hợp về vị trí).
Nó là thể cố gắng cải thiện đoán ở bước cuối cùng bằng cách cố gắng mã hóa khác nhau khác nhau và chọn một trong đó có chuỗi ít nhất của các chữ cái với rác ở giữa, trong đó “rác” là bất kỳ nhân vật đó là không phải là một chữ cái, dấu cách hoặc dấu chấm câu thông thường. Điều này sẽ làm tăng đáng kể sự phức tạp trong khi không thực sự đáng tin cậy.
Tóm lại, để có thể xử lý tất cả các mã hóa sẵn có, bạn cần phải làm những gì TextEdit làm: shunt quyết định đối với người dùng.
Ồ, một điều nữa: tính đến 10.5, mã hóa thường được lưu trữ với một tệp trong thuộc tính com.apple.TextEncoding mở rộng không có giấy tờ. Nếu bạn mở một tệp có +[NSString stringWithContentsOfFile:]
hoặc tương tự, thì tệp này sẽ tự động được sử dụng nếu có.
Nguồn
2009-08-29 15:55:00
Có vẻ như có một lý do tại sao nó là chưa chính thức. Tôi chạy nó với một mã hóa NSData PDF nó trở về-2147482362. – FireDragonMule
Tôi không hoàn toàn chắc chắn nếu đó là cách nó được dự định để làm việc. Một pdf không phải là một chuỗi và phương pháp này tìm mã hóa cho các chuỗi từ một 'NSData'. Ý định của bạn là gì? – HAS
Tôi đang truy xuất bản pdf thông qua SDK dưới dạng NSData. Tôi chỉ gặp sự cố khi hiển thị nó trong chế độ xem web ngay bây giờ vì tôi không biết mã hóa là gì hoặc liệu có mã hóa hay không. – FireDragonMule