2011-02-09 14 views
7

Durante la lettura di un file di testo che è stato creato da qualche altra parte al di fuori della mia app, la codifica utilizzata è sconosciuta. La mia app sta utilizzando NSUnicodeStringEncoding (che è la stessa di NSUTF16StringEncoding), quindi ho problemi a leggere i file codificati in UTF16.Come leggere il file di testo senza conoscere la codifica

C'è un modo per indovinare la codifica di un file? La mia priorità è quella di poter leggere i file UTF8 e quindi tutti gli altri file. Sta iterando attraverso le codifiche disponibili e controlla se la lunghezza della stringa di lettura è maggiore di zero è davvero un buon approccio?

Grazie in anticipo.

Ignacio

+1

Ci sono alcune domande correlate su Stack Overflow: http://stackoverflow.com/questions/1351151/guess-encoding-when-creating-an-nsstring-from-nsdata http://stackoverflow.com/questions/4198804/how-to-reliable-guess- the-encoding-between-macroman-cp1252-latin1-utf-8-and-a http://stackoverflow.com/questions/373081/how-can-i-best-guess-the-encoding-when-the-bom -byte-order-mark-è-missin g (e altri). È possibile adattare chardet a Objective-C: http://chardet.feedparser.org/ –

risposta

8

la documentazione di Apple ha alcune indicazioni su come procedere: String Programming Guide: Reading data with an unknown encoding:

Se si è costretti a indovinare la codifica (e notare che, in assenza di informazioni esplicite, è una supposizione):

  1. Prova stringWithContentsOfFile:usedEncoding:error: o initWithContentsOfFile:usedEncoding:error: (o gli equivalenti basati su URL). Questi metodi cercano di determinare la codifica della risorsa e, in caso di esito positivo, restituiscono per riferimento la codifica utilizzata.

  2. Se (1) non riesce, provare a leggere la risorsa specificando UTF-8 come codifica.

  3. Se (2) non riesce, provare una codifica legacy appropriata. "Appropriato" qui dipende un po 'dalle circostanze; potrebbe essere la codifica C string predefinita, potrebbe essere ISO o Windows Latin 1 o qualcos'altro, a seconda della provenienza dei dati.

1

Se il file è correttamente costruito potete leggere i primi quattro byte e vedere se si tratta di un BOM (Byte Order Mark):

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

+0

Non molto utile. Questo ti dice solo l'endianess di una codifica Unicode. – Raedwald

+0

Ti dice anche la codifica: UTF-8, UTF-16 (BE), UTF-16 (LE), UTF-32 (BE), UTF-32 (LE), UTF-7, UTF-EBCDIC, ecc. –

Problemi correlati