Estoy tratando de entender mejor la codificación de caracteres. Para experimentar, quiero tomar una cadena de caracteres y codificar de diferentes maneras. ¿El indicador zsh tiene una forma de crear archivos que usan codificaciones de caracteres específicas? Por ejemplo, estoy intentando crear archivos que utilicen las siguientes codificaciones de caracteres:

  • ASCII
  • Unicode
  • UTF32
  • UTF8

Me gustaría ver la misma cadena de caracteres codificada en cada una de estas codificaciones para compararlas y contrastarlas. Gracias.

answer

Como shell, zsh en su mayoría no se ocupa de estas cosas directamente, pero puede hacerlo ejecutando otros programas a través de zsh. (Aunque, claro, zsh en particular es muy rico en funciones integradas a diferencia de la mayoría de los otros shells, pero la conversión de codificación de caracteres no parece ser una de ellas).

Para convertir codificaciones de caracteres dentro del shell, generalmente iconvse usa la herramienta: la -fopción especifica de qué codificación se debe convertir; -tla codificación de destino; y los datos se leen desde stdin. Por ejemplo:

echo "Here are some arrows 🠈, 🠊, 🠉, 🠋" > text_in_utf8.txt

iconv -f utf-8 -t utf-16 < text_in_utf8.txt > text_in_utf16.txt

(Por lo general, la configuración regional del sistema se establece en UTF-8, por lo que cualquier cosa que escriba directamente en el shell, por ejemplo, echoen el ejemplo anterior, también terminará siendo UTF-8. Pero asegúrese de verificarlo usando locale charmap).

También están disponibles otras codificaciones de caracteres como iso8859-1o ibm437; consulte iconv -lpara obtener una lista. (Tenga en cuenta que "Unicode" es solo el conjunto de caracteres abstractos, pero no una codificación en sí misma. Cuando vea "Unicode" como una codificación en Windows, en realidad significa UTF-16 o UCS-2 en versiones muy antiguas).

También hay otras formas de experimentar con codificaciones de caracteres. Por ejemplo, en Python puede .encode()convertir una cadena Unicode en bytes usando una codificación específica, o .decode()bytes de vuelta a una cadena Unicode:

$ python
>>> text = "🠈 🠊 🠉 🠋"
>>> utf8bytes = text.encode("utf-8")
>>> utf16bytes = text.encode("utf-16")
>>> ["%02x" % b for b in utf8bytes]
['f0', '9f', 'a0', '88', '20', 'f0', '9f', 'a0', '8a', '20',
 'f0', '9f', 'a0', '89', '20', 'f0', '9f', 'a0', '8b']

(En este caso, me refiero a "cadena Unicode" en el sentido abstracto, a diferencia de la nota anterior).