2011-02-09 16 views
7

Podczas czytania pliku tekstowego utworzonego w innym miejscu niż moja aplikacja kodowanie jest nieznane. Moja aplikacja używa NSUnicodeStringEncoding (która jest taka sama jak NSUTF16StringEncoding), więc mam problemy z odczytaniem plików zakodowanych w UTF16.Odczytywanie pliku tekstowego bez znajomości kodowania

Czy jest jakiś sposób, aby odgadnąć kodowanie pliku? Moim priorytetem jest możliwość odczytu plików UTF8, a następnie wszystkich innych plików. Czy iteracja przez dostępne kodowania i sprawdzenie, czy długość łańcucha odczytu jest większa od zera, to naprawdę dobre podejście?

Z góry dziękuję.

Ignacio

+1

Istnieje kilka pytania na tematy Stack Overflow: http://stackoverflow.com/questions/1351151/guess-encoding-when-creating-an-nsstring-from-nsdata http://stackoverflow.com/questions/4198804/how-to-reliably-guess- the-encoding-between-macroman-cp1252-latin1-utf-8-and-a http://stackoverflow.com/questions/373081/how-can-i-best-guess-tode-encoding-when-the-bom -Byte-order-mark-is-missin g (i inne). Możesz dostosować chardet do Objective-C: http://chardet.feedparser.org/ –

Odpowiedz

8

dokumentacji Apple ma pewne wskazówki, jak postępować: String Programming Guide: Reading data with an unknown encoding:

Jeśli jesteś zmuszony do odgadnięcia kodowania (i pamiętać, że w przypadku braku wyraźnej informacji, że jest to przypuszczenie)

  1. Spróbuj stringWithContentsOfFile:usedEncoding:error: lub initWithContentsOfFile:usedEncoding:error: (lub oparte równoważników URL). Metody te próbują określić kodowanie zasobu, a jeśli powiodą się powrócić przez odniesienie używane kodowanie.

  2. Jeśli (1) się nie powiedzie, spróbuj odczytać zasób, określając kodowanie jako UTF-8.

  3. Jeśli (2) się nie powiedzie, spróbuj zastosować starsze kodowanie. "Właściwe" tutaj zależy trochę od okoliczności; może to być domyślne kodowanie ciągów znaków C, może to być ISO lub Windows Latin 1 lub coś innego, w zależności od tego skąd pochodzą dane.

1

Jeśli plik jest prawidłowo skonstruowana można przeczytać pierwsze cztery bajty i sprawdzić, czy to jest BOM (Byte Order Mark):

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

+0

Niezbyt użyteczne. To tylko mówi o endianess kodowania Unicode. – Raedwald

+0

Mówi również kodowanie: UTF-8, UTF-16 (BE), UTF-16 (LE), UTF-32 (BE), UTF-32 (LE), UTF-7, UTF-EBCDIC, itp. –

Powiązane problemy