In Unicode haben einige Zeichenkombinationen mehr als eine Darstellung.
Beispielsweise kann das Zeichen ä dargestellt werden als
- "ä", das ist der Codepunkt U + 00E4 (zwei Bytes
c3 a4
bei UTF-8-Codierung) oder as - "ä", das sind die beiden Codepunkte U + 0061 U + 0308 (drei Bytes
61 cc 88
in UTF-8).
Gemäß dem Unicode-Standard sind die beiden Darstellungen äquivalent, jedoch in unterschiedlichen "Normalisierungsformen", siehe UAX Nr. 15: Unicode-Normalisierungsformen .
Die Unix-Toolbox enthält alle Arten von Texttransformations-Tools, sed , tr , iconv und Perl. Wie kann ich eine schnelle und einfache NF-Konvertierung in der Befehlszeile durchführen?
perl -MUnicode::Normalization -e 'print NFC(
...Antworten:
Sie können das
uconv
Dienstprogramm von der Intensivstation aus verwenden . Die Normalisierung erfolgt durch Transliteration (-x
).Auf Debian ist Ubuntu und andere Derivate
uconv
imlibicu-dev
Paket. Auf Fedora, Red Hat und anderen Derivaten und in BSD-Ports ist es imicu
Paket enthalten.quelle
any-nfd
? Es sieht so aus, als ob die Entwicklung dieses Tools abgebrochen wurde, das letzte Update war 2005.any-nfd
durch Durchsuchen der Liste gefunden, die von angezeigt wirduconv -L
.sudo apt install icu-devtools
laufenuconv -x any-nfc
, aber nicht das einfachste Problem lösen , zB einebugText.txt
Datei mit "Iglésias, Bad-á, Good-á" konvertiert, indemuconv -x any-nfc bugText.txt > goodText.txt
der gleiche Text beibehalten wird.Python hat ein
unicodedata
Modul in seiner Standardbibliothek, mit dem Unicode-Darstellungen durch folgendeunicodedata.normalize()
Funktionen übersetzt werden können:Laufen mit Python 3.x:
Python ist nicht gut für Shell-One-Liner geeignet, kann jedoch ausgeführt werden, wenn Sie kein externes Skript erstellen möchten:
Für Python 2.x müssen Sie encoding line (
# -*- coding: utf-8 -*-
) hinzufügen und Strings als Unicode mit dem Zeichen u markieren:quelle
Überprüfen Sie es mit dem Werkzeug hexdump:
konvertiere mit iconv und überprüfe erneut mit hexdump:
quelle
utf-8-mac
unter Linux keine habe und ob dies normal ist.Der Vollständigkeit halber mit
perl
:quelle
coreutils hat einen Patch, um einen richtigen zu bekommen
unorm
. funktioniert gut für mich auf 4byte wchars. folgen http://crashcourse.housegordon.org/coreutils-multibyte-support.html#unorm Das verbleibende Problem gibt es 2-Byte - wchar Systeme (Cygwin, Fenster, sowie AIX- und Solaris auf 32 - Bit), die Codepoints von oben zu transformieren müssen Ebenen in Ersatzpaare und umgekehrt, und die zugrunde liegende libunistring / gnulib kann das noch nicht verarbeiten.Perl hat das
unichars
Tool, das auch die verschiedenen Normalisierungsformen in der Cmdline ausführt. http://search.cpan.org/dist/Unicode-Tussle/script/unicharsquelle
Es gibt ein Perl-Dienstprogramm namens Charlint von
https://www.w3.org/International/charlint/
was macht was du willst. Sie müssen auch eine Datei von herunterladen
ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt
Nach der ersten Ausführung beschwert sich Charlint über inkompatible Einträge in dieser Datei, sodass Sie diese Zeilen aus UnicodeData.txt löschen müssen.
quelle