J'essaie de mieux comprendre l'encodage des caractères. Pour expérimenter, je veux prendre une chaîne de caractères et encoder de différentes manières. L'invite zsh permet-elle de créer des fichiers utilisant des codages de caractères spécifiques ? Par exemple, j'essaie de créer des fichiers qui utilisent les encodages de caractères suivants :

  • ASCII
  • Unicode
  • UTF32
  • UTF8

J'aimerais voir la même chaîne de caractères codée dans chacun de ces codages pour les comparer et les contraster. Merci.

answer

En tant que shell, zsh ne gère généralement pas ces choses directement - mais vous pouvez le faire en exécutant d'autres programmes via zsh. (Bien que, bien sûr, zsh en particulier soit très riche en fonctions intégrées contrairement à la plupart des autres shells, mais la conversion de codage de caractères ne semble pas en faire partie.)

Pour convertir les encodages de caractères dans le shell, l' iconvoutil est généralement utilisé - l' -foption spécifie à partir de quel encodage convertir ; -tl'encodage cible ; et les données sont lues à partir de stdin. Par exemple:

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

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

(Habituellement, les paramètres régionaux du système sont définis sur UTF-8, donc tout ce que vous tapez directement dans le shell - par exemple echodans l'exemple ci-dessus - finira également par être UTF-8. Mais assurez-vous de le vérifier en utilisant locale charmap.)

D'autres codages de caractères tels que iso8859-1ou ibm437sont également disponibles ; voir iconv -lpour une liste. (Notez que "Unicode" n'est que le jeu de caractères abstrait mais pas un codage en soi. Lorsque vous voyez "Unicode" comme un codage dans Windows, cela signifie en fait UTF-16 ou UCS-2 dans les très anciennes versions).

Il existe également d'autres façons d'expérimenter les codages de caractères. Par exemple, en Python, vous pouvez .encode()transformer une chaîne Unicode en octets à l'aide d'un encodage spécifique, ou .decode()revenir en octets en une chaîne 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']

(Dans ce cas, je veux dire "chaîne Unicode" dans le sens abstrait, contrairement à la note précédente.)