En general, no se puede. Sin embargo, puede identificar confiablemente los archivos UTF-8: si un archivo es UTF-8 válido, no es probable que se suponga que sea otra codificación (excepto si todos los bytes están en el rango ASCII, en cuyo caso cualquier " la codificación extendida ASCII ", que incluye UTF-8, le dará el mismo resultado). Todas las codificaciones Unicode también tienen un BOM opcional que los identifica. Entonces, un enfoque razonable sería:
- Busque una lista de materiales válida. Si hay uno, usa la codificación apropiada.
- De lo contrario, intente interpretarlo como UTF-8. Puede hacerlo llamando al
initWithData:data encoding:NSUTF8StringEncoding
y verificando si el resultado es no nulo.
- Si eso falla, use una codificación predeterminada de 8 bits, como
-[NSString defaultCStringEncoding]
(que proporciona una conjetura apropiada para la configuración regional).
Se es posible para tratar de mejorar la conjetura en el último paso por tratar varias codificaciones diferentes y elegir el que tiene secuencias de menor número de letras con basura en el medio, donde “basura” es cualquier carácter que es no es una letra, espacio o signo de puntuación común. Esto aumentaría significativamente la complejidad sin ser confiable en realidad.
En resumen, para poder manejar todas las codificaciones disponibles, debe hacer lo que TextEdit hace: derivar la decisión al usuario.
Una cosa más: a partir de 10.5, la codificación a menudo se almacena con un archivo en el atributo extendido com.apple.TextEncoding no documentado. Si abre un archivo con +[NSString stringWithContentsOfFile:]
o similar, esto se usará automáticamente si está presente.
parece que hay una razón por la que es no oficial todavía. Lo ejecuté con una codificación PDF NSData que devuelve -2147482362. – FireDragonMule
No estoy muy seguro de si así es como funciona. Un pdf no es una cadena y este método encuentra codificaciones para cadenas de un 'NSData'. ¿Cuál es tu intención? – HAS
Estoy recuperando un pdf a través de un SDK como NSData. Solo estoy teniendo problemas para mostrarlo en la vista web en este momento porque no sé cuál es la codificación o si incluso hay una codificación. – FireDragonMule