es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Perl: Reparar archivo XML utf8 que contiene códigos octales o hexadecimales.

Obtuve de un servidor Linux un archivo XML en una máquina con Windows 10. El archivo estaba codificado en base64. Decodifiqué el XML usando un script Perl que usa la función decode_base64 de MIME::Base64. Probé con otro script Perl si está bien formado, pero este no era el caso:

C:\test>perl test_well_formed.pl test.xml
test.xml:3: error del analizador : ¡La entrada no es un UTF-8 válido, indique la codificación!
Bytes: 0xFC 0x6C 0x6C 0x65
<print>M³ller</print>
        ^

Miré el contenido. Notepad++ muestra el diéresis ü como código hexadecimal:

<?xml version="1.0" encoding="utf-8"?>
<test>
<print>MxFCller</print>
</test>

y Emacs muestra ü como código octal:

<?xml version="1.0" encoding="utf-8"?>
<test>
<print>M\374ller</print>
</test>

La codificación en Emacs era:

 El valor es 'utf-8-dos'

Obviamente, los códigos hexadecimales y octales no están permitidos en XML utf8.

Lo que quiero es:

<?xml version="1.0" encoding="utf-8"?>
<test>
<print>Müller</print>
</test>

Mi pregunta principal es: ¿Cómo puedo reparar los archivos XML?

Una solución podría ser leer con un script Perl línea por línea o “slurp” y reemplazar el código hexadecimal (¿o código octal?) con el diéresis. ¿O hay una mejor manera de repararlo? ¿Por ejemplo, se pueden considerar los caracteres con diéresis al convertir el archivo base64?

Una segunda pregunta es: ¿Por qué un editor muestra códigos octales y el otro códigos hexadecimales?

Aquí están las capturas de pantalla de notepad++ y Emacs:
aquí
aquí

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para reparar los archivos XML, una solución podría ser escribir un script en Perl que lea el archivo línea por línea o use el método slurp, reemplace el código hexadecimal u octal con la diéresis y luego guarde el archivo actualizado. Otra posible solución es asegurarse de que la conversión de base64 a XML incluya la codificación adecuada para las diéresis.

    En cuanto a la segunda pregunta, la razón por la que un editor muestra códigos octales y el otro muestra códigos hexadecimales se debe a la forma en que manejan la codificación de caracteres especiales. Emacs utiliza códigos octales para caracteres especiales, mientras que Notepad++ utiliza códigos hexadecimales. Esta diferencia en la codificación puede causar problemas al analizar un archivo XML, como se ve en el ejemplo proporcionado.

Comments are closed.