Ich habe eine Liste von Unicode-Codepunkten, aber ich kenne keine "einfache" Möglichkeit, diese Hex-Werte in die tatsächlichen Zeichen zu konvertieren, die sie darstellen ...
Ich habe gehört, dass zsh hat echo -e '\u0965'
, aber ich benutze Bash 4.1.
Gibt es etwas so Einfaches wie die zsh-Methode für Bash?
Antworten:
Sie können bashs Echo oder / bin / echo von GNU coreutils in Kombination mit iconv verwenden:
Standardmäßig konvertiert iconv in Ihre Gebietsschemacodierung. Möglicherweise ist Perl portabler als die Verwendung eines bestimmten Shell- oder Echo-Befehls. Die meisten mir bekannten UNIX-Systeme verfügen über Perl und sogar über mehrere Windows-Ports.
Die meiste Zeit, wenn ich das tun muss, bin ich in einem Editor wie Vim / GVim, der integrierte Unterstützung hat. Drücken Sie im Einfügemodus Strg-V, gefolgt von u, und geben Sie dann vier Hexadezimalzeichen ein. Wenn Sie ein Zeichen jenseits von U + FFFF möchten, verwenden Sie ein U in Großbuchstaben und geben Sie 8 hexadezimale Zeichen ein. Vim unterstützt auch benutzerdefinierte, einfach zu erstellende Keymaps. Es konvertiert eine Reihe von Zeichen in ein anderes Symbol. Ich habe zum Beispiel eine von mir entwickelte Keymap namens www, die TM in ™, (C) in ©, (R) in ® und so weiter konvertiert. Ich habe auch eine Keymap für Klingonisch für den Fall, dass dies notwendig wird. Ich bin sicher, Emacs hat etwas Ähnliches. Wenn Sie sich in einer GTK + -Anwendung befinden, die GVim und GNOME Terminal enthält, können Sie Control-Shift-u gefolgt von 4 Hex-Zeichen verwenden, um ein Unicode-Zeichen zu erstellen. Ich bin sicher, KDE / Qt hat etwas Ähnliches.
UPDATE: Ab Bash 4.2 scheint es ein eingebautes Feature zu sein:
UPDATE: Heutzutage wird wahrscheinlich ein Python-Beispiel Perl vorgezogen. Dies funktioniert sowohl in Python 2 als auch in 3:
quelle
chr 0xa2
in einem UTF-8-Gebietsschema drucke, bekomme ich ein Cent-Zeichen ¢, aber wenn ich LANG = C verwende, bekomme ich , weil es das in UTF-8 ungültige Byte 0xa2 druckt. Das Vim / GVim-Beispiel ist für das Gebietsschema semi-sensitiv. Genauer gesagt zur Dateicodierung. Wenn Sie Vim in einem Nicht-UTF-8-Gebietsschema gestartet haben, müssen Sie:set encoding=utf-8
chr 0x12000
in Perl (vorausgesetzt, Unicode ist aktiv) verwenden, um es darzustellen. In UTF-16BE sind dies 0xd8, 0x08, 0xdc und 0x00. Ihr Zeichen ist U + 0965, was zufällig die Bytes 0x09 gefolgt von 0x65 in UTF-16BE sind.perl
Antwort jetzt die beste (für meine speziellen Anforderungen). Ich hatte printf zuvor ausgeschlossen (vor Monaten). , aber ich hatte es vergessen. Hier ist die Frage / Antwort über ihre Grenzen ... Warum meldet printf einen Fehler mit Ausnahme von drei (ASCII-Bereich) Unicode-CodepunktenBash 4.2 (veröffentlicht im Jahre 2011) Unterstützung für
echo -e '\u0965'
,printf '\u0965'
,printf %b '\u0965'
undecho $'\u0965'
auch Arbeit.http://tiswww.case.edu/php/chet/bash/FAQ :
quelle
bash 4.2.x
Versionen einen Fehler aufweisen, bei dem Werte zwischen0x80
und0xff
(128 - 255
) - dh im erweiterten ASCII-Bereich - NICHT korrekt UTF8-codiert und stattdessen nur durchgereicht werden, was zu einem ungültigen UTF8-Zeichen führt, das einige Terminals als darstellen?
. Ab (mindestens) wurde4.3.11
dies behoben; Wirdecho $'\ued'
gerendertí
, ist der Fehler nicht vorhanden.Wenn Sie GNU Coreutils haben, versuchen Sie
printf
:echo
kann die Aufgabe erledigen, wenn Ihre Konsole UTF-8 verwendet und Sie die UTF-8-Codierung haben:Eine Tabelle mit Unicode-zu-UTF-8-Hex-Codierungen finden Sie hier: http://www.utf8-chartable.de/ . Sie können die Unicode-Codepunkte mit einer Reihe von Skriptsprachen in Hex konvertieren. Hier ist ein Beispiel mit Python:
Das folgende Perl-Skript konvertiert Argumente in den richtigen Hexadezimalwert (viele unnötige Klammern hier):
Zum Beispiel,
Wenn Sie Perl oder Python haben, können Sie diese natürlich auch zum Drucken der Zeichen verwenden.
quelle
echo
nicht was ich will, da die Codepoints 2-Byte-UTF-16-Big-Endian sind .. aber du hast mich daran erinnert, dass es 2 printf-Funktionen gibt! (Ich dachte printf könnte es tun und es scheint, als würde ich das falsche aufrufen) ...$(which printf)
funktioniert ... Danke für das Python-Beispiel ... aber für dieses (meine Lernkurve) versuche ich, so nah wie möglich zu bleiben Möglichst "bash" als einzige Scriptsprache. (Wenn ich mit bash vertraut bin, werde ich in Python stecken bleiben. Übrigens.encode('hex')
ist ein Schritt weiter, als ich brauche.) (Ich dachte, es sah so aus ein bisschen beschäftigt dort :)printf
Obigen, aber es behandelt keine Werte unter `` \ u00A0... 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*
perl` Lösung sieht jetzt ziemlich gut aus :) .. Es ist eine einzelne Aufforderung, und ich nach "einfach zu tippen", also gebe ich ihm das grüne Häkchen fürperl
UPDATE: Hier ist ein bash Weise einen einzelnen Unicode - Wert zu tun ... (durch "bash" Ich meine: nicht ein andere Skriptsprache) .. dank Gilles für eine suggeston in diesem askubuntu Q / A .
Laut diesem Link : recode (obsoletes iconv, dos2unix, unix2dos) .. Edit: aber laut dem Kommentar unten, kann "obsoletes" nur "alternative" bedeuten
Hier ist eine Methode, um einen rohen Hex-Dump als Eingabe zu verarbeiten (dh keine Escape-Präfixe wie; \ u0965 und no \ x09 \ x65) ..
xxd
ist ein Hex-Dump-Dienstprogramm ( gepackt mitvim-common
), mit dem ein roher Hex-Dump zurückgesetzt werden kann für die Zeichen, die der Dump darstellt ... Unicode-Codepoints sind UTF-16BigEndian, was genau das ist, was ein Hex-Dump ist.xxd
Im Revert-Modus wird ein Stream von Hex-Werten mit Zeilenumbrüchen akzeptiert, die ignoriert werden.Dieses Skript erstellt einen UTF-16BE-Stream, der dann auf die ursprünglichen Zeichen zurückgesetzt wird.
Die letzte Zeile enthält die beiden benötigten Befehle.
xxd
undiconv
Hier ist der Ausgang (der zuerst den UTF-16BE-Hex-Dump-Eingang zeigt).
Hinweis;
xxd
segmentiert seine eigene Ausgabe mit einer Newline mit 60 Hex-Ziffern ... Die Option revert ignoriert diese Newlines. Es werden alle Newlines ignoriert (da es sich nicht um Hex-Ziffern handelt).quelle
bash
Methode. Mit "Bash" meine ich: Verwenden der Bash-Skriptsprache; nicht Python / Perl aus Bash). Ich habe dies als Antwort hinzugefügt, da es für jemanden, der diese Seite liest, von Nutzen sein kann. Es ist ein guter Einzeiler für eine ganze Datei. Duprintf
bist die beste Antwort für mich.Unter der Annahme, dass die Standardcodierung für Ihr Betriebssystem UTF-8 ist (gilt für die meisten aktuellen Distributionen), können Sie bash direkt zum Konvertieren von UNICODE-Codepunkten verwenden:
Natürlich wird die Glyphe nur dann richtig angezeigt, wenn Sie die richtige Schriftart haben. Ab Bash 4.3 funktionieren alle Codepunkte korrekt. Und diese beiden eingebauten Optionen funktionieren auch:
Beachten Sie, dass für Bash 4.2 die Unicode-Codepunkte von
0x80
bis0xFF
falsch codiert sind (Bash-Fehler). Um dieses Problem zu umgehen, müssen Sie sich das Programm auf dieser Site ansehen (auch für einen tieferen Einblick in das Problem der Konvertierung von Zahlen in Zeichen geeignet).quelle
https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.html
Beschreibung: \ u und \ u kodieren falsch Werte zwischen \ u80 und \ uffVerwenden der Mustersubstitution in der Bash-Version 4.2 (und höher):
wie hier beschrieben http://steve-parker.org/sh/tips/pattern-substitution/
quelle