Cómo renderizar caracteres en lugar de hexadecimales (\x60)
Tengo un archivo (file.txt) con el siguiente contenido:
file.txt:
+ "Capítulo 8\n“Mucho más que una 'A'”: una colaboración transformadora entre un centro de escritura de escuela secundaria y universidad
<ul>
<li>"Capítulo 9\n“Oh, puedo contar con un poco de ayuda de mis amigos”: colaboraciones de corto plazo entre el centro de escritura y la comunidad"
```</li>
</ul>
Mi código extrae ciertos datos de esto con gawk, y luego escribe los resultados en un nuevo archivo <em>(nav.txt)</em> usando <strong>printf</strong>.
nav.txt:
</code></pre>
Capítulo 8 \xE2\x80\x9CMucho más que una 'A'”: una colaboración transformadora entre un centro de escritura de escuela secundaria y universidad
Capítulo 9 \xE2\x80\x9COh, puedo contar con un poco de ayuda de mis amigos\xE2\x80\x9D: colaboraciones de corto plazo
```
¿Alguien sabe por qué los caracteres especiales (como ‘, -, etc.) se representan como estos extraños códigos hexadecimales? (\xE2\x80\x98A, \xE2\x80\x9D, etc.)
Si es así, ¿cómo puedo mostrar los caracteres correctos en nav.txt, en lugar de sus equivalentes hexadecimales?
Mi código gawk, ejecutándose en Ubuntu:
gawk
gawk '
match($0, /^[|+-]."([^"]+)".#([[:digit:]]+)/, m) {
printf "<li>\n <a href=\"mybook%04d.xhtml\">%s</a>\n </li>\n", m[2], m[1] >> "nav.txt"
}
' file.txt
davy.ai
Los extraños códigos hexadecimales son en realidad la codificación UTF-8 de los caracteres especiales. Esto ocurre cuando la terminal o el editor de texto utilizado para ver los archivos no tienen un soporte adecuado para UTF-8.
Para mostrar los caracteres correctos en nav.txt, necesitamos especificar la codificación al escribir el archivo. Podemos hacer esto usando el comando
iconv
.Aquí está el código modificado:
En este código, estamos utilizando el comando
iconv
para convertir la cadena de entrada (m[1]
) desde la codificación actual a UTF-8. La cadena convertida se utiliza luego en la instrucciónprintf
.Ten en cuenta que la opción
IGNORE
se usa coniconv
para ignorar cualquier carácter inválido en lugar de detener el proceso de conversión.