2008-11-25 16 views
7

Tengo varios archivos que están en varios idiomas diferentes. Pensé que todos estaban codificados en UTF-8, pero ahora no estoy tan seguro. Algunos personajes se ven bien, otros no. ¿Hay alguna forma de que pueda romper las cadenas y tratar de identificar los conjuntos de caracteres? Tal vez dividir en el espacio en blanco y luego identificar cada palabra? Finalmente, ¿hay una manera fácil de traducir caracteres de un conjunto a UTF-8?¿Cómo determino el conjunto de caracteres de una cadena?

Respuesta

6

Si no conoce el juego de caracteres para asegurarse de que sólo se puede adivinar, básicamente. utf8::valid podría ayudarte con eso, pero realmente no puedes estar seguro. Si sabes que si no es unicode, debe ser un juego de caracteres específico (como Latin-1), tienes suerte. Si no tienes idea, estás jodido. En cualquier caso, siempre debe suponer que el archivo completo está en el mismo juego de caracteres, a menos que se especifique lo contrario. Perderás la cordura si no lo haces.

cuanto a su pregunta de cómo convertir entre conjuntos de caracteres: Encode hay que hacer eso para usted

6

La determinación de si un archivo es, probablemente, UTF-8 o no debería ser bastante fácil. Determinar la codificación si no es UTF-8 sería muy difícil en general.

Si el archivo está codificado con UTF-8, los bits altos de cada byte deben seguir un patrón. Si un carácter es un byte, su bit alto se borrará (cero). De lo contrario, un carácter de n bytes (donde n es 2 – 4) tendrá los altos n bits del primer byte establecidos en uno, seguidos de un único bit cero. Los siguientes n - 1 bytes deberían tener el bit más alto establecido y el segundo bit más alto borrado.

Si todos los bytes en su archivo siguen estas reglas, es probable que esté codificado con UTF-8. Digo probablemente, porque cualquiera puede inventar una nueva codificación que siga las mismas reglas, deliberadamente o por casualidad, pero interpreta los códigos de manera diferente.

Tenga en cuenta que un archivo codificado con US-ASCII seguirá estas reglas, pero el bit alto de cada byte es cero. Está bien tratar un archivo como UTF-8, ya que son compatibles en este rango. De lo contrario, es otra codificación, y no hay una prueba inherente para distinguir la codificación. Tendrás que usar algunos conocimientos contextuales para adivinar.

Cuestiones relacionadas