J'ai une liste de points de code Unicode, mais je ne connais pas de moyen "simple" de convertir ces valeurs hexadécimales en caractères réels qu'elles représentent ...
J'ai entendu dire que zsh l' a fait echo -e '\u0965'
, mais j'utilise bash 4.1.
Existe-t-il quelque chose d'aussi simple que la méthode zsh, pour bash?
Réponses:
Vous pouvez utiliser l'écho de bash ou / bin / echo de GNU coreutils en combinaison avec iconv:
Par défaut, iconv se convertit en votre encodage local. Perl est peut-être plus portable que de s'appuyer sur un shell spécifique ou une commande echo. La plupart des systèmes UNIX que je connais ont Perl disponible et même plusieurs ports Windows.
La plupart du temps, lorsque je dois faire cela, je suis dans un éditeur comme Vim / GVim qui a un support intégré. En mode insertion, appuyez sur Ctrl-V suivi de u, puis tapez quatre caractères hexadécimaux. Si vous voulez un caractère au-delà de U + FFFF, utilisez un U majuscule et tapez 8 caractères hexadécimaux. Vim prend également en charge des keymaps personnalisés faciles à créer. Il convertit une série de caractères en un autre symbole. Par exemple, j'ai une carte-clé que j'ai développée, appelée www, elle convertit TM en ™, (C) en ©, (R) en ®, etc. J'ai également une carte-clé pour Klingon lorsque cela devient nécessaire. Je suis sûr qu'Emacs a quelque chose de similaire. Si vous êtes dans une application GTK + qui comprend GVim et GNOME Terminal, vous pouvez essayer Control-Shift-u suivi de 4 caractères hexadécimaux pour créer un caractère Unicode. Je suis sûr que KDE / Qt a quelque chose de similaire.
MISE À JOUR: À partir de Bash 4.2, il semble être une fonctionnalité intégrée maintenant:
MISE À JOUR: De plus, de nos jours, un exemple Python serait probablement préféré à Perl. Cela fonctionne à la fois en Python 2 et 3:
la source
chr 0xa2
dans un environnement local UTF-8, j'obtiens un signe cents ¢, mais si j'utilise LANG = C, j'obtiens car il imprime l'octet 0xa2 qui n'est pas valide en UTF-8. L'exemple Vim / GVim est semi-sensible aux paramètres régionaux. Plus correctement, au codage du fichier. Si vous avez démarré Vim dans un environnement local non UTF-8, vous devrez:set encoding=utf-8
chr 0x12000
en Perl (en supposant qu'Unicode est actif) pour le représenter. Dans UTF-16BE, il s'agit de 0xd8, 0x08, 0xdc et 0x00. Votre caractère est U + 0965 qui se trouve être juste les octets 0x09 suivis de 0x65 dans UTF-16BE.perl
réponse est maintenant la meilleure (pour mes besoins particuliers) .. J'avais précédemment exclu printf (il y a des mois) , mais je l'avais oublié. Voici le queston / réponse sur ses limites ... Pourquoi printf signale une erreur sur tous les points deBash 4.2 (publié en 2011) a ajouté la touche pour
echo -e '\u0965'
,printf '\u0965'
,printf %b '\u0965'
etecho $'\u0965'
aussi le travail.http://tiswww.case.edu/php/chet/bash/FAQ :
la source
bash 4.2.x
versions ont un bogue où les valeurs entre0x80
et0xff
(128 - 255
) - c'est-à-dire dans la plage ASCII étendue - ne sont PAS correctement codées en UTF8 et sont simplement transmises, ce qui entraîne un caractère UTF8 non valide que certains terminaux rendent?
. Depuis (au moins),4.3.11
cela a été corrigé; siecho $'\ued'
s'afficheí
, le bogue n'est pas présent.Si vous avez des coreutils GNU, essayez
printf
:echo
peut faire le travail si votre console utilise UTF-8 et que vous avez le codage UTF-8:Vous pouvez trouver un tableau des codages hexadécimaux Unicode vers UTF-8 ici: http://www.utf8-chartable.de/ . Vous pouvez convertir les points de code Unicode en hexadécimal à l'aide d'un certain nombre de langages de script. Voici un exemple utilisant python:
Ce qui suit est un script Perl qui convertira les arguments en la valeur hexadécimale correcte (de nombreuses parenthèses inutiles ici):
Par exemple,
Bien sûr, si vous avez Perl ou Python, vous pouvez également les utiliser pour imprimer les caractères.
la source
echo
ne fera pas ce que je veux, car les Codepoints sont des Big-Endian UTF-16 à 2 octets .. mais vous m'avez rappelé qu'il y a 2 fonctions printf! (Je pensais que printf pouvait le faire, et il semble que j'invoque le mauvais) ...$(which printf)
fonctionne ... Merci pour l'exemple python .. mais pour cela (ma courbe d'apprentissage), j'essaie de rester aussi proche que possible de "bash" comme le seul langage d'écriture impliqué .. (quand je serai assez à l'aise avec bash, je resterai coincé dans Python ... btw,.encode('hex')
c'est un pas au-delà de ce dont j'ai besoin .. (je pensais que ça avait l'air un peu occupé là-dedans :)printf
précède, mais il ne gère pas les valeurs inférieures à la... I've just re-discovered something I already knew (but dropped off the radar)... Here is a Question I asked about 4 months ago; [Why does printf report an error on all but three (ASCII-range) Unicode Codepoints](http://askubuntu.com/questions/20806/why-does-printf-report-an-error-on-all-but-three-ascii-range-unicode-codepoints)... So *penguin359's*
solution `` \ u00A0 perl` semble assez bien maintenant :) .. C'est un seul appel, et après "facile à taper", je vais donc donner lui la coche verte pourperl
MISE À JOUR: Voici une façon bash de faire une seule valeur Unicode ... (par "bash" je veux dire: ne pas utiliser un autre langage de script) .. merci à Gilles pour une suggestion dans ce Q / R askubuntu .
Selon ce lien : recode (Obsoletes iconv, dos2unix, unix2dos) .. Edit: mais selon le commentaire ci-dessous, "obsoletes" peut simplement signifier "alternative"
Voici une méthode pour traiter un vidage hexadécimal brut en entrée (c.-à-d. Aucun préfixe d'échappement comme; \ u0965 et aucun \ x09 \ x65) ..
xxd
est un utilitaire de vidage hexadécimal (fourni avecvim-common
) qui peut annuler un vidage hexadécimal brut aux caractères que le vidage représente ... Les points de code Unicode sont UTF-16BigEndian, ce qui est exactement ce qu'est un vidage hexadécimal ..xxd
en mode retour accepte un flux de valeurs hexadécimales avec des sauts de ligne qui sont ignorés.Ce script crée un flux UTF-16BE, qu'il rétablit ensuite aux caractères d'origine.
La dernière ligne contient les deux commandes nécessaires;
xxd
eticonv
Voici la sortie (montrant l'entrée de vidage hexadécimal UTF-16BE, en premier).
Remarque;
xxd
segmente sa propre sortie avec une nouvelle ligne à 60 chiffres hexadécimaux ... L'option de retour ignore ces nouvelles lignes .. elle ignore toutes les nouvelles lignes (car ce ne sont pas des chiffres hexadécimaux) ..la source
bash
méthode simple et rapide . Par «bash», j'entends: utiliser le langage de script bash; pas python / perl depuis bash). J'ai ajouté ceci comme réponse car cela peut être d'une certaine valeur pour quelqu'un qui lit cette page. C'est une bonne doublure pour un fichier entier. Votreprintf
réponse est la meilleure pour moi.En supposant que l'encodage par défaut de votre système d'exploitation est UTF-8 (vrai pour la plupart des distributions actuelles), vous pouvez utiliser directement bash pour convertir n'importe quel point de code UNICODE:
Bien sûr, le glyphe n'apparaîtra correctement que si vous avez la bonne police. Depuis bash 4.3, tous les points de code fonctionneront correctement. Et ces deux options intégrées fonctionneront également:
Notez que pour bash 4.2, le code Unicode pointe de
0x80
à0xFF
n'est pas encodé correctement (bug bash). Pour contourner ce problème, vous devez jeter un œil au programme sur ce site (également bon pour un examen approfondi du problème de la conversion des nombres en caractères.la source
https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.html
Description: \ u et \ U encodent incorrectement des valeurs entre \ u80 et \ uffUtilisation de la substitution de modèle dans bash version 4.2 (et versions supérieures):
comme décrit ici http://steve-parker.org/sh/tips/pattern-substitution/
la source