Je voudrais ajouter le crâne et les os croisés Unicode à mon invite de shell (en particulier le `` SKULL AND CROSSBONES '' (U + 2620)), mais je ne peux pas comprendre l'incantation magique pour faire résonner l'écho, ou tout autre, Caractère Unicode à 4 chiffres. Les deux chiffres sont faciles. Par exemple, echo -e "\ x55",.
En plus des réponses ci-dessous, il convient de noter que, évidemment, votre terminal doit prendre en charge Unicode pour que la sortie soit ce que vous attendez. gnome-terminal fait un bon travail, mais il n'est pas nécessairement activé par défaut.
Sur l'application Terminal de macOS Allez dans Préférences-> Encodages et choisissez Unicode (UTF-8).
bash
shell
unicode
character-encoding
masukomi
la source
la source
"\x7F"
un environnement UTF-8 (ce que labash
balise suggère que le vôtre est) ... les modèles représentés par un seul octet ne sont jamais dans la plage\x80-\xFF
. Cette plage est illégale dans les caractères UTF-8 à un octet. par exemple, une valeur Unicode Codepoint deU+0080
(ie.\x80
) est en fait de 2 octets en UTF-8 ..\xC2\x80
..printf "\\u007C\\u001C"
.gnome-terminal
,echo -e '\ufc'
ne produit pas de ü, même avec un encodage de caractères réglé sur UTF-8. Cependant, par exemple,urxvt
imprime par exempleprintf "\\ub07C\\ub01C"
comme prévu (pas avec un ou une boîte).bash
balise est-elle un indice si utile? Les différents terminaux sont-ils communs dans CJK ou…?Réponses:
En UTF-8, il s'agit en fait de 6 chiffres (ou 3 octets).
Pour vérifier comment il est encodé par la console, utilisez hexdump:
la source
LANG=C
au lieu deLANG=en_US.UTF-8
. Maintenant, mes terminaux dans Gnome affichent correctement les symboles ... Les vrais terminaux (tty1-6) ne le font toujours pas.0000000 f0 9f 8d ba
traduit par\xf0\x9f\x8d\xba
. Exemple écho:echo -e "\xf0\x9f\x8d\xba"
.$'...'
syntaxe pour obtenir le caractère encodé dans une variable sans utiliser de$(...)
sous-shell de capture, pour une utilisation dans des contextes qui n'interprètent pas eux-mêmes les séquences d'échappement:skull=$'\xE2\x98\xA0'
0000000 98e2 00a0
. Bien sûr,0000000
c'est juste un décalage sans importance, mais les octets après cela se traduisent par\xe2\x98\xa0
, car la machine utilise le petit ordre d'octets endian.Cela fonctionne dans Zsh (j'ai vérifié la version 4.3) et dans Bash 4.2 ou plus récent.
la source
Tant que vos éditeurs de texte peuvent faire face à Unicode (vraisemblablement encodé en UTF-8), vous pouvez entrer directement le point de code Unicode.
Par exemple, dans l' éditeur de texte Vim, vous entrez en mode d'insertion et appuyez sur Ctrl+ V+ Upuis sur le numéro de point de code sous la forme d'un nombre hexadécimal à 4 chiffres (complétez avec des zéros si nécessaire). Vous devez donc taper Ctrl+ V+ U 2 6 2 0. Voir: Quelle est la façon la plus simple d'insérer des caractères Unicode dans un document?
Sur un terminal exécutant Bash, vous devez taper CTRL+ SHIFT+ Uet taper le point de code hexadécimal du caractère souhaité. Pendant la saisie, votre curseur doit afficher un souligné
u
. Le premier non numérique que vous saisissez termine la saisie et affiche le caractère. Ainsi, vous pourrez imprimer U + 2620 dans Bash en utilisant ce qui suit:echo CTRL+ SHIFT+U2620ENTERENTER
(La première entrée termine l'entrée Unicode et la seconde exécute la
echo
commande.)Crédit: Ask Ubuntu SE
la source
C-S-u 2 6 2 0
est une fonctionnalité de votre émulateur de terminal, méthode d'entrée X (XIM) ou similaire. AFAIK, vous ne pourrez pas envoyer les deuxSHIFT
etCTRL
vers la couche terminale. Le terminal ne parle qu'en caractères, plutôt qu'en clés et codes clés comme votre serveur X (également, il est 7 bits à toutes fins utiles). Dans ce monde,CTRL
masque les 4 bits les plus significatifs (& 0b00001111), ce qui donneVoici une implémentation Bash entièrement interne, pas de fourche, taille illimitée de caractères Unicode.
La sortie était:
la source
Mettez simplement "☠" dans votre script shell. Dans les paramètres régionaux corrects et sur une console compatible Unicode, cela s'imprimera très bien:
Une "solution de contournement" laide serait de sortir la séquence UTF-8, mais cela dépend aussi du codage utilisé:
la source
Une ligne rapide pour convertir les caractères UTF-8 dans leur format à 3 octets:
la source
printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u)
.... xxd est expédié dans le cadre du package 'vim-common'hexFromGlyph(){ if [ "$1" == "-n" ]; then outputSeparator=' '; shift; else outputSeparator='\n'; fi for glyph in "$@"; do printf "\\\x%s" $(printf "$glyph"|xxd -p -c1 -u); echo -n -e "$outputSeparator"; done } # usage: $ hexFromGlyph ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF $ hexFromGlyph -n ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF
codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z
... profitez 👍J'utilise ceci:
C'est plus facile que de chercher une représentation hexadécimale ... J'utilise ceci dans mes scripts shell. Cela fonctionne sur gnome-term et urxvt AFAIK.
la source
Vous devrez peut-être coder le point de code en octal pour que l'expansion rapide le décode correctement.
U + 2620 codé en UTF-8 est E2 98 A0.
Donc, dans Bash,
rendra votre coquille rapide en crâne et en os.
la source
En bash pour imprimer un caractère Unicode pour la sortie, utilisez \ x, \ u ou \ U (premier pour un hexadécimal à 2 chiffres, second pour un hexadécimal à 4 chiffres, troisième pour n'importe quelle longueur)
Si vous voulez l'affecter à une variable, utilisez la syntaxe $ '...'
la source
Si cela ne vous dérange pas un Perl one-liner:
-CS
active le décodage UTF-8 en entrée et le codage UTF-8 en sortie.-E
évalue l'argument suivant comme Perl, avec des fonctionnalités modernes commesay
activé. Si vous ne voulez pas de nouvelle ligne à la fin, utilisezprint
plutôt quesay
.la source
Chacune de ces trois commandes imprimera le caractère souhaité dans une console, à condition que la console accepte les caractères UTF-8 (les plus courants le font):
Après, vous pouvez copier et coller le glyphe réel (image, caractère) dans n'importe quel éditeur de texte (activé UTF-8).
Si vous avez besoin de voir comment un tel point de code Unicode est encodé en UTF-8, utilisez xxd (une visionneuse hexagonale bien meilleure que od):
Ou, dans HEX pour éviter les erreurs: 0xE2 0x98 0xA0. Autrement dit, les valeurs entre l'espace (HEX 20) et le saut de ligne (Hex 0A).
Si vous voulez approfondir la conversion des nombres en caractères: regardez ici pour voir un article du wiki de Greg (BashFAQ) sur le codage ASCII dans Bash!
la source
La fonction
printf
intégrée (tout comme les coreutilsprintf
) connaît la\u
séquence d'échappement qui accepte les caractères Unicode à 4 chiffres:Test avec Bash 4.2.37 (1):
la source
\printf
pour utiliser l'exécutable autonome, ou essayez avec bash mis à niveauDésolé d'avoir relancé cette vieille question. Mais lors de l'utilisation,
bash
il existe une approche très simple pour créer des points de code Unicode à partir d'une entrée ASCII ordinaire, qui ne débouche même pas du tout:Utilisez-le comme suit pour définir certains points de code
ou pour vider les premiers 65536 points de code unicode vers stdout (cela prend moins de 2 secondes sur ma machine. L'espace supplémentaire est d'empêcher certains caractères de s'écouler les uns dans les autres en raison de la police monospace du shell):
ou pour raconter l'histoire d'un parent très typique (cela nécessite Unicode 2010):
Explication:
printf '\UXXXXXXXX'
imprime tout caractère Unicodeprintf '\\U%08x' number
imprime\UXXXXXXXX
avec le nombre converti en hexadécimal, celui-ci est ensuite envoyé à un autreprintf
pour réellement imprimer le caractère Unicodeprintf
reconnaît octal (0oct), hex (0xHEX) et décimal (0 ou nombres commençant par 1 à 9) comme des nombres, vous pouvez donc choisir la représentation qui convient le mieuxprintf -v var ..
rassemble la sortie deprintf
dans une variable, sans fork (ce qui accélère énormément les choses)local variable
est là pour ne pas polluer l'espace de noms globallocal -n var=other
aliasvar
àother
, tels que l'affectation àvar
altèreother
. Une partie intéressante ici est, quivar
fait partie de l'espace de noms local, tandis queother
fait partie de l'espace de noms global.local
ou d'global
espace de noms dansbash
. Les variables sont conservées dans l'environnement, et celles-ci sont toujours globales. Local supprime simplement la valeur actuelle et la restaure lorsque la fonction est à nouveau abandonnée. Les autres fonctions appelées à l'intérieur de la fonction aveclocal
verront toujours la valeur "locale". Il s'agit d'un concept fondamentalement différent de toutes les règles de portée normales trouvées dans d'autres langages (et cebash
qui est très puissant mais peut entraîner des erreurs si vous êtes un programmeur qui n'en est pas conscient).la source
Voici une liste de tous les emoji Unicode disponibles:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
Exemple:
Pour obtenir la valeur ASCII de ce caractère, utilisez hexdump
Et puis utilisez les valeurs renseignées au format hexadécimal
la source
Sur la base des questions de débordement de pile Couper Unix, supprimer le premier jeton et https://stackoverflow.com/a/15903654/781312 :
La sortie est la suivante.
la source
Facile avec une doublure Python2 / 3:
Résulte en:
la source
Dans Bash:
Production:
la source
Si la valeur hexadécimale du caractère unicode est connue
Si la valeur décimale d'un caractère unicode est connue
la source