2011-02-09 16 views
7

Al leer un archivo de texto que se creó en otro lugar fuera de mi aplicación, la codificación utilizada es desconocida. Mi aplicación utiliza NSUnicodeStringEncoding (que es lo mismo que NSUTF16StringEncoding) por lo que tiene problemas para leer archivos que no sean UTF16 codificados.Cómo leer archivos de texto sin conocer la codificación

¿Hay alguna manera de adivinar la codificación de un archivo? Mi prioridad es poder leer archivos UTF8 y luego todos los demás archivos. Está iterando a través de codificaciones disponibles y verifica si la longitud de la cadena de lectura es mayor que cero, ¿es realmente un buen enfoque?

Gracias de antemano.

Ignacio

+1

Hay algunas preguntas relacionadas en Stack Overflow: http://stackoverflow.com/questions/1351151/guess-encoding-when-creating-an-nsstring-from-nsdata http://stackoverflow.com/questions/4198804/how-to-reliably-guess- la-codificación-entre-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-is-missin g (y otros). Podría adaptar chardet a Objective-C: http://chardet.feedparser.org/ –

Respuesta

8

documentación de Apple tiene alguna orientación sobre cómo proceder: String Programming Guide: Reading data with an unknown encoding:

Si se ve obligado a adivinar la codificación (y tenga en cuenta que, en ausencia de información explícita, es una conjetura):

  1. Trate stringWithContentsOfFile:usedEncoding:error: o initWithContentsOfFile:usedEncoding:error: (o los equivalentes basados ​​en URL). Estos métodos intentan determinar la codificación del recurso, y si es exitoso devuelve por referencia la codificación utilizada.

  2. Si (1) falla, intente leer el recurso especificando UTF-8 como la codificación.

  3. Si falla (2), intente con una codificación heredada adecuada. "Apropiado" aquí depende un poco de las circunstancias; podría ser la codificación de cadena C predeterminada, podría ser ISO o Windows Latin 1, u otra cosa, dependiendo de dónde provengan sus datos.

1

Si el archivo es una buena construcción se pueden leer los primeros cuatro bytes y ver si se trata de una lista de materiales (Byte Order Mark):

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

+0

No es muy útil. Eso solo te dice la endiabilidad de una codificación Unicode. – Raedwald

+0

También le dice la codificación: UTF-8, UTF-16 (BE), UTF-16 (LE), UTF-32 (BE), UTF-32 (LE), UTF-7, UTF-EBCDIC, etc. –

Cuestiones relacionadas