2008-09-25 15 views
39

Tengo un archivo de texto con codificación ANSI que no debería haber sido codificado como ANSI ya que había caracteres acentuados que ANSI no admite. Prefiero trabajar con UTF-8.¿Cómo corrijo la codificación de caracteres de un archivo?

¿Se pueden decodificar los datos correctamente o se pierde en la transcodificación?

¿Qué herramientas podría usar?

Aquí está una muestra de lo que tengo:

ç é 

que puedo decir de contexto (cafetería © debe haber cafetería) que éstas deberían ser estos dos personajes:

ç é 
+0

¿Conoces la codificación original del archivo (suponiendo que se haya convertido en algún punto de un juego de caracteres a otro)? De ser así, debería poder asignar los caracteres resultantes a los caracteres originales utilizando tablas como [esta] (http://www.alanwood.net/demos/charsetdiffs.html). Si no conoce la codificación original, probablemente pueda resolverla utilizando un enfoque probabilístico, basado en la frecuencia de las diferentes palabras en el idioma con el que está trabajando. Pero puede que no estés dispuesto a poner en el trabajo que requeriría. – gregory

+0

Lamentablemente, no, no sé la codificación original. Es un problema común cuando los clientes le envían archivos creados en una variedad de sistemas. Es posible que no sepan qué es la codificación de caracteres. Tenga en cuenta que la creciente adopción de escritorios Linux que usan UTF-8 de forma predeterminada podría reducir este problema de forma transparente. – Liam

+0

Estoy totalmente de acuerdo. UTF-8 es definitivamente la codificación más razonable para usar en la mayoría de las situaciones, pero no se puede esperar que los clientes comprendan o actúen sobre eso, desafortunadamente. – gregory

Respuesta

18

EDITAR: Una posibilidad simple de eliminar antes de entrar en soluciones más complicadas: ¿ha intentado configurar el conjunto de caracteres en utf8 en el editor de texto en el que está leyendo el archivo? Esto podría ser solo el caso de alguien enviándole un archivo utf8 que está leyendo en un editor configurado para decir cp1252.

Simplemente tomando los dos ejemplos, este es un caso de lectura de utf8 a través de la lente de una codificación de un solo byte, probablemente una de iso-8859-1, iso-8859-15 o cp1252. Si puede publicar ejemplos de otros personajes problemáticos, debería ser posible reducirlo más.

Como la inspección visual de los caracteres puede ser engañosa, también tendrá que mirar los bytes subyacentes: el § que ve en la pantalla podría ser 0xa7 o 0xc2a7, y eso determinará el tipo de conversión de conjunto de caracteres que Tener que hacer.

¿Puede suponer que todos sus datos se han distorsionado exactamente de la misma manera? Que provienen de la misma fuente y pasaron por la misma secuencia de transformaciones, por lo que, por ejemplo, no hay una sola é en su texto, siempre es ç? Si es así, el problema se puede resolver con una secuencia de conversiones de juegos de caracteres. Si puede ser más específico sobre el entorno en el que se encuentra y la base de datos que está utilizando, es posible que alguien aquí le indique cómo realizar la conversión adecuada.

De lo contrario, si los caracteres problemáticos solo aparecen en algunos lugares de sus datos, deberá tomarlos instancia por instancia, basándose en suposiciones como "ningún autor tiene la intención de poner ç en su texto, así que cada vez que lo veas, reemplaza por ç ". La última opción es más arriesgada, en primer lugar porque esas suposiciones sobre las intenciones de los autores pueden ser erróneas, en segundo lugar porque tendrá que detectar a cada personaje problemático usted mismo, lo que podría ser imposible si hay demasiado texto para inspeccionar visualmente o si está escrito en un idioma o sistema de escritura que sea extraño para usted.

+0

gracias Donal, alguna sugerencia para ver los bytes? – Liam

+0

Un montón de opciones, dependiendo de dónde se encuentre: hd -c nombre de archivo, abriéndolo en vi y mirando los caracteres "extraños" escapes, bin2hex en php, hex (nombre de campo) en mysql. –

+1

Gracias, esta parece ser la mejor solución.Entender los bytes subyacentes y reemplazarlos inteligentemente parece ser la opción más inteligente, desarrollando un script para automatizar los cambios. – Liam

2

Con vim línea de comandos:

vim -c "set encoding=utf8" -c "set fileencoding=utf8" -c "wq" filename 
3
+0

¿Una conversión simple supondrá que los datos son correctos y conservará los datos incorrectos? – Liam

+0

Sí, lo hará. Creo que la gente está malinterpretando la pregunta. El problema es que los datos ya están dañados, por lo que necesita una solución correctiva. – gregory

0

Y luego está el programa un poco más viejo recode.

1

Si ve signos de interrogación en el archivo o si los acentos ya están perdidos, volver a utf8 no ayudará a su causa. p.ej. si el café se convirtió en café, cambiar la codificación por sí solo no ayudará (y necesitará datos originales).

Puede pegar texto aquí, eso nos ayudará a responder con seguridad.

0

Hay programas que intentan detectar la codificación de un archivo como chardet. Entonces podrías convertirlo a una codificación diferente usando iconv. Pero eso requiere que el texto original esté intacto y no se pierda información (por ejemplo, eliminando acentos o letras con acentos enteros).

8

Cuando ve secuencias de caracteres como ç y à ©, generalmente es una indicación de que un archivo UTF-8 ha sido abierto por un programa que lo lee como ANSI (o similar). caracteres Unicode como éstas:

U + 00C2 América A mayúscula con acento circunflejo
U + 00C3 América letra mayúscula A con tilde
U + 0082 rotura permitidos aquí
U + 0083 Sin descanso aquí

tienden a aparecer en el texto ANSI debido a la estrategia de bytes variables que utiliza UTF-8. Esta estrategia se explica muy bien here.

La ventaja para usted es que la apariencia de estos caracteres impares hace que sea relativamente fácil encontrar, y así reemplazar, las instancias de conversión incorrecta.

Creo que, dado que ANSI siempre usa 1 byte por carácter, puede manejar esta situación con una simple operación de búsqueda y reemplazo. O más convenientemente, con un programa que incluye una asignación de tabla entre las secuencias ofensivas y los caracteres deseados, como los siguientes:

â € œ -> “# Debe haber una cotización rizado doble apertura
â €? -> "# debe ser una cita de cierre doble rizado

Cualquier texto dado, suponiendo que esté en inglés, tendrá un número relativamente pequeño de diferentes tipos de sustituciones.

Espero que ayude.

0

Encontré una manera simple de detectar automáticamente las codificaciones de archivos - cambie el archivo a un archivo de texto (en una mac renombre la extensión a .txt) y arrástrelo a una ventana de Mozilla Firefox (o Archivo -> Abrir) . Firefox detectará la codificación, puedes ver lo que ocurrió en View -> Character Encoding.

Cambié la codificación de mi archivo usando TextMate una vez que sabía la codificación correcta. Archivo -> Vuelva a abrir utilizando la codificación y elija su codificación. Luego Archivo -> Guardar como y cambie la codificación a UTF-8 y terminaciones de línea a LF (o lo que quiera)

0

En OS X Synalyze It! le permite mostrar partes de su archivo en diferentes codificaciones (todas las cuales son compatibles con Biblioteca ICU). Una vez que sepa cuál es la codificación de origen, puede copiar el archivo completo (bytes) a través del portapapeles e insertarlo en un documento nuevo donde se selecciona la codificación de destino (UTF-8 o lo que quiera).

muy útil cuando se trabaja con UTF-8 u otras representaciones Unicode es UnicodeChecker

13

Siga estos pasos con Notepad ++

1- Copiar el texto original

2- En Notepad ++, nuevo archivo abierto, cambiar Codificación -> elija una codificación que crea que sigue el texto original.Intenta así la codificación "ANSI" como a veces archivos Unicode se leen como ANSI por ciertos programas

3- Pegar

4- A continuación, para convertir a Unicode por ir otra vez sobre el mismo menú: Codificación -> "Codificar en UTF-8 "(no" Convertir a UTF-8 ") y con suerte se volverá legible

Los pasos anteriores se aplican para la mayoría de los idiomas. Solo tiene que adivinar la codificación original antes de pegar en Notepad ++, luego convierta a través del mismo menú a una codificación alternativa basada en Unicode para ver si las cosas se vuelven legibles.

La mayoría de los lenguajes existen en 2 formas de codificación: 1- La mayoría de las computadoras usaban inicialmente el antiguo formato heredado ANSI (ASCII), de solo 8 bits. 8 bits solo permitieron 256 posibilidades, 128 de ellas donde el latín regular y los caracteres de control, los últimos 128 bits se leyeron de manera diferente dependiendo de la configuración de idioma de la PC 2- El nuevo estándar Unicode (hasta 32 bit) proporciona un código único para cada personaje en todos los idiomas actualmente conocidos y mucho más por venir. si un archivo es unicode, debe entenderse en cualquier PC con la fuente del idioma instalada. Tenga en cuenta que incluso UTF-8 alcanza hasta 32 bit y es tan amplio como UTF-16 y UTF-32 solo intenta mantener 8 bits con caracteres latinos solo para ahorrar espacio en disco

+0

Gracias, broda, su respuesta me salvó de un problema de 2 días con la codificación de un archivo .sql. Funciona. ¡Tornillo de texto sublime en Mac! – WhySoSerious

+0

funcionó como un encanto –

+0

eres un genio – Nir

0

Encontré esta pregunta al buscar para una solución a un problema de página de códigos que tenía con caracteres chinos, pero al final mi problema era simplemente un problema con Windows que no los mostraba correctamente en la interfaz de usuario.

En caso de que alguien más tenga el mismo problema, puede solucionarlo simplemente cambiando las ventanas locales en China y luego otra vez.

he encontrado la solución aquí:

http://answers.microsoft.com/en-us/windows/forum/windows_7-desktop/how-can-i-get-chinesejapanese-characters-to/fdb1f1da-b868-40d1-a4a4-7acadff4aafa?page=2&auth=1

también upvoted respuesta de Gabriel como buscar los datos en el Notepad ++ fue lo que me avisó acerca de las ventanas.

1

En el editor de texto sublime, archivo -> vuelva a abrir con codificación -> elija la codificación correcta.

Generalmente, la codificación se detecta automáticamente, pero si no, puede utilizar el método anterior.

Cuestiones relacionadas