¿Alguien puede explicar este comportamiento relacionado con la codificación?

¿Alguien puede explicar este comportamiento relacionado con la codificación?

La codificación no es mi punto fuerte, a pesar de haber leído bastante.

Hay un archivo que quiero editar, su extensión es .tdl, pero eso no significa nada en particular.

Es un archivo XML. La primera línea se ve así:

<?xml version="1.0" encoding="utf-16"?>

Cuando intento abrir este archivo con gedit, aparece un mensaje grande sobre un fondo amarillo que dice:

"Hubo un problema al abrir el archivo... El archivo que abrió tiene algunos caracteres no válidos. Si continúa editando este archivo, podría dañar este documento. También puede elegir otra codificación de caracteres e intentar nuevamente"

El cuadro desplegable Codificación de caracteres debajo dice "Configuración regional actual (UTF-8)".

Intento configurarlo en "Unicode (UTF-16)" y hago clic en "Reintentar". El mensaje desagradable vuelve y el menú desplegable vuelve a establecerse en "Configuración regional actual (UTF-8)".

También intenté abrir el archivo yendo a Archivo --> Abrir --> Codificación de caracteres: cambie de "Detectado automáticamente" a "Unicode (UTF-16)". Pero recibo el mensaje desagradable nuevamente, nuevamente con el menú desplegable configurado en "Configuración regional actual (UTF-8)".

Mediante programación (usando Groovy groovy.xml.XMLParser), puedo analizar este archivo y producir una groovy.util.Nodeestructura aparentemente válida. Todavía no he llegado a la etapa de intentar guardar esta estructura interna del Nodo, ya sea modificada o no.

¿Alguien puede decirme cuál es el problema (si es que hay alguno) con este archivo y cómo puedo editarlo de forma segura?

Respuesta1

En UTF-16, los caracteres están en dos bytes y, para los caracteres ASCII, el byte superior es 0x00.

Por ejemplo "Algo" en UTF-16 es:

00000000  ff fe 53 00 6f 00 6d 00  65 00 74 00 68 00 69 00  |..S.o.m.e.t.h.i.|
00000010  6e 00 67 00 0a 00                                 |n.g...|

( OxFFFEAl principio está la marca de orden de bytes, si ve 0xFEFF sabrá que tiene que intercambiar bytes...).

Los caracteres NUL por todas partes confunden el software...

Puedes convertir a un UTF-8 más razonable, usando iconv:

iconv -f UTF-16 -t UTF-8 <utf16file >utf8file

Y no olvides cambiar la codificación en el encabezado del archivo.

Respuesta2

Si el archivo es UTF-16 (codificación típica de Windows), tendrá problemas en Linux (UTF-8 nativo, militante...). Al menos GNU emacs dice que admite UTF-16, nunca lo ha usado con ira.

Puede intentar recode(1) para traducir a UTF-8 (y arreglar encabezados y demás para que coincidan), pero eso podría dañar horriblemente las herramientas que esperan UTF-16.

Actualizar:Solo pensé en esto: recodificar a UTF-8; destrozar, destrozar, desfigurar a su gusto; Vuelva a codificar a UTF-16. De esa manera puedes utilizar herramientas familiares en el medio. Perohacercorrige la codificación UTF-16 anunciada, quién sabe si las herramientas se confunden. O tal vez las herramientas de manipulación de XML presten atención a esto...

información relacionada