Dies ist der Befehl perluniintro, der im kostenlosen OnWorks-Hosting-Provider über eine unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, Windows-Online-Emulator oder MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
perluniintro - Einführung in Perl Unicode
BESCHREIBUNG
Dieses Dokument gibt eine allgemeine Vorstellung von Unicode und wie man Unicode in Perl verwendet. Sehen
"Weitere Ressourcen" für Verweise auf tiefergehende Behandlungen von Unicode.
Unicode
Unicode ist ein Zeichensatzstandard, der alle Schriftsysteme von kodieren soll
die Welt, plus viele andere Symbole.
Unicode und ISO/IEC 10646 sind aufeinander abgestimmte Standards, die fast alle anderen modernen
Zeichensatzstandards, die mehr als 80 Schriftsysteme und Hunderte von Sprachen abdecken,
einschließlich aller kommerziell wichtigen modernen Sprachen. Alle Charaktere in der größten
Chinesische, japanische und koreanische Wörterbücher werden ebenfalls codiert. Die Standards werden irgendwann
decken fast alle Zeichen in mehr als 250 Schriftsystemen und Tausenden von Sprachen ab.
Unicode 1.0 wurde im Oktober 1991 und 6.0 im Oktober 2010 veröffentlicht.
Ein Unicode Charakter ist eine abstrakte Einheit. Es ist nicht an eine bestimmte ganze Zahl gebunden
Breite, insbesondere nicht für die C-Sprache "char". Unicode ist sprachneutral und anzeige-
neutral: Es kodiert nicht die Sprache des Textes und definiert es nicht allgemein
Schriftarten oder andere grafische Layoutdetails. Unicode funktioniert mit Zeichen und erstelltem Text
von diesen Charakteren.
Unicode definiert Zeichen wie "LATIN CAPITAL LETTER A" oder "GREEK SMALL LETTER ALPHA" und
eindeutige Nummern für die Zeichen, in diesem Fall 0x0041 bzw. 0x03B1. Diese
eindeutige Nummern heißen Code Punkte. Ein Codepunkt ist im Wesentlichen die Position des
Zeichen innerhalb der Menge aller möglichen Unicode-Zeichen, und damit in Perl der Begriff
Ordinal- wird oft synonym damit verwendet.
Der Unicode-Standard bevorzugt die Verwendung der hexadezimalen Notation für die Codepunkte. Wenn Zahlen
wie 0x0041 sind Ihnen unbekannt, werfen Sie einen Blick auf einen späteren Abschnitt, "Hexadezimale Notation".
Der Unicode-Standard verwendet die Notation "U+0041 LATIN CAPITAL LETTER A", um die
hexadezimaler Codepunkt und der normative Name des Zeichens.
Unicode definiert auch verschiedene immobilien für die Zeichen, wie "Großbuchstaben" oder
"Kleinbuchstabe", "Dezimalziffer" oder "Interpunktion"; diese Eigenschaften sind unabhängig von den
Namen der Charaktere. Darüber hinaus können verschiedene Operationen an den Charakteren wie
Großbuchstaben, Kleinbuchstaben und Sortieren (Sortieren) sind definiert.
Ein Unicode logisch "Zeichen" kann tatsächlich aus mehr als einem internen bestehen präsentieren
"Zeichen" oder Codepunkt. Für westliche Sprachen wird dies adäquat modelliert durch a Base
Charakter (wie "LATIN CAPITAL LETTER A") gefolgt von einem oder mehreren Modifikatoren (mögen
"KOMBINIEREN AKUTE AKZENTE"). Diese Folge von Basiszeichen und Modifikatoren heißt a
Vereinigung Charakter Reihenfolge. Einige nicht-westliche Sprachen erfordern kompliziertere Modelle,
also hat Unicode die erstellt Graphem Gruppe Konzept, das später weiter verfeinert wurde
verlängert Graphem Gruppe. Zum Beispiel wird eine koreanische Hangul-Silbe als Single betrachtet
logisches Zeichen, besteht aber meistens aus drei tatsächlichen Unicode-Zeichen: einem führenden
Konsonant gefolgt von einem inneren Vokal gefolgt von einem nachgestellten Konsonanten.
Ob Sie diese erweiterten Graphem-Cluster "Charaktere" nennen, hängt von Ihrem Standpunkt ab
Aussicht. Wenn Sie ein Programmierer sind, würden Sie wahrscheinlich dazu neigen, jedes Element in der
Sequenzen als eine Einheit oder "Charakter". Doch aus Sicht des Nutzers ist das Ganze
Sequenz könnte als ein "Zeichen" angesehen werden, da es wahrscheinlich so aussieht in der
Kontext der Sprache des Benutzers. In diesem Dokument nehmen wir die Sicht des Programmierers ein:
ein "Zeichen" ist ein Unicode-Codepunkt.
Für einige Kombinationen von Basiszeichen und Modifikatoren gibt es vorkomponiert Zeichen.
Es gibt ein einzelnes Zeichen-Äquivalent, zum Beispiel für die Sequenz "LATIN CAPITAL
LETTER A" gefolgt von "COMBINING ACUTE ACCENT". Es heißt "LATIN CAPITAL LETTER A ."
WITH ACUTE". Diese vorkomponierten Zeichen sind jedoch nur für einige verfügbar
Kombinationen und sollen hauptsächlich Roundtrip-Konvertierungen zwischen Unicode und
ältere Standards (wie ISO 8859). Die Verwendung von Sequenzen, wie dies bei Unicode der Fall ist, ermöglicht das Erfordernis von
weniger Grundbausteine (Codepunkte), um viel mehr potenzielles Graphem auszudrücken
Cluster. Um die Umwandlung zwischen gleichwertigen Formen zu unterstützen, verschiedene Normalisierung Formen sind
auch definiert. Somit ist "LATIN GROSSBUCHSTABE A MIT AKUT" in Normalisierung Form
Bestehend, (abgekürzt NFC) und die Sequenz "LATIN CAPITAL LETTER A" gefolgt von
"COMBINING ACUTE ACCENT" steht für das gleiche Zeichen in Normalisierung Form Zerlegt
(NFD).
Aufgrund der Abwärtskompatibilität mit Legacy-Codierungen ist die "eine eindeutige Nummer für jeden"
Charakter"-Idee bricht etwas zusammen: Stattdessen gibt es "mindestens eine Zahl für jeden"
Charakter". Derselbe Charakter könnte in mehreren Vermächtnissen unterschiedlich dargestellt werden
Kodierungen. Das Gegenteil ist nicht der Fall: Einige Codepunkte haben kein zugewiesenes Zeichen.
Erstens gibt es nicht zugewiesene Codepunkte innerhalb sonst verwendeter Blöcke. Zweitens gibt es
sind spezielle Unicode-Steuerzeichen, die keine echten Zeichen darstellen.
Als Unicode zum ersten Mal konzipiert wurde, dachte man, dass alle Zeichen der Welt sein könnten
dargestellt unter Verwendung eines 16-Bit-Wortes; das sind maximal 0x10000 (oder 65,536) Zeichen würden
benötigt werden, von 0x0000 bis 0xFFFF. Dies erwies sich bald als falsch, und seit Unicode 2.0
(Juli 1996), Unicode wurde bis zu 21 Bit (0x10FFFF) definiert und Unicode
3.1 (März 2001) definierte die ersten Zeichen über 0xFFFF. Die ersten 0x10000 Zeichen
heißen die Flugzeug 0Oder das Grundlagen Mehrsprachigkeit Flugzeug (BMP). Mit Unicode 3.1, 17 (ja,
siebzehn) Ebenen wurden insgesamt definiert – aber sie sind bei weitem nicht voll von definierten
Charaktere noch.
Wenn eine neue Sprache codiert wird, wählt Unicode im Allgemeinen einen "Block" von
aufeinanderfolgende nicht zugewiesene Codepunkte für seine Zeichen. Bisher ist die Anzahl der Codepunkte
in diesen Blöcken war immer durch 16 teilbar. Extras in einem Block, derzeit nicht
benötigt, bleiben für zukünftiges Wachstum nicht zugewiesen. Aber es gab Fälle, in denen a
spätere Veröffentlichung benötigte mehr Codepunkte als die verfügbaren Extras, und ein neuer Block musste
an anderer Stelle zugewiesen, nicht angrenzend an die ursprüngliche, um den Überlauf zu behandeln.
So wurde schon früh klar, dass "Block" kein adäquates Organisationsprinzip war,
und so wurde die Eigenschaft "Script" erstellt. (Später wurde eine verbesserte Skripteigenschaft hinzugefügt, da
Nun, die Eigenschaft "Script_Extensions".) Diese Codepunkte, die sich in Überlaufblöcken befinden
kann immer noch das gleiche Skript wie die Originale haben. Das Drehbuchkonzept passt eher
mit natürlicher Sprache: es gibt "lateinische" Schrift, "griechische" Schrift und so weiter; und da sind
mehrere künstliche Skripte, wie "Common" für Zeichen, die mehrfach verwendet werden
Skripte wie mathematische Symbole. Skripte umfassen normalerweise verschiedene Teile von mehreren
Blöcke. Weitere Informationen zu Skripten finden Sie unter "Skripte" in perlunicode. Der Unternehmensbereich
in Blöcken besteht, aber es ist fast vollständig zufällig - ein Artefakt, wie die
Charaktere wurden und werden immer noch zugewiesen. (Beachten Sie, dass dieser Absatz
Dinge zu stark vereinfacht, damit dies eine Einführung ist. Unicode nicht wirklich
kodieren Sprachen, aber die Schriftsysteme für sie – ihre Skripte; und ein Skript kann sein
von vielen Sprachen verwendet. Unicode kodiert auch Dinge, bei denen es nicht wirklich um Sprachen geht,
wie etwa Symbole wie "GEPÄCKSPRUNG".)
Die Unicode-Codepunkte sind nur abstrakte Zahlen. Um diese Zusammenfassungen ein- und auszugeben
Zahlen, die Zahlen müssen sein codiert or serialisiert irgendwie. Unicode definiert mehrere
Charakter Codierung Formen, Von denen UTF-8 ist am beliebtesten. UTF-8 ist eine variable Länge
Kodierung, die Unicode-Zeichen als 1 bis 4 Byte kodiert. Andere Kodierungen umfassen UTF-16
und UTF-32 und ihre Big- und Little-Endian-Varianten (UTF-8 ist unabhängig von der Byte-Reihenfolge).
Die ISO/IEC 10646 definiert die Kodierungsformen UCS-2 und UCS-4.
Weitere Informationen zu Codierungen – zum Beispiel, um zu erfahren, was Leihmütterchen und Byte
Auftrag Marken (BOMs) sind - siehe Perlunicode.
Perls Unicode Unterstützung
Ab Perl v5.6.0 kann Perl nativ mit Unicode umgehen. Perl
v5.8.0 ist jedoch die erste empfohlene Version für ernsthafte Unicode-Arbeiten. Die
Wartungsversion 5.6.1 hat viele der Probleme des ursprünglichen Unicodes behoben
Implementierung, aber zum Beispiel funktionieren reguläre Ausdrücke immer noch nicht mit Unicode in
5.6.1. Perl v5.14.0 ist die erste Version, bei der die Unicode-Unterstützung (fast) nahtlos ist
integrierbar ohne einige Fallstricke (mit Ausnahme einiger Unterschiede in Quotemeta und
das ist ab Perl 5.16.0 behoben). Um diese nahtlose Unterstützung zu ermöglichen, sollten Sie "verwenden
Feature 'unicode_strings'" (das automatisch ausgewählt wird, wenn Sie "5.012" oder höher verwenden).
Siehe Funktion. (5.14 behebt auch eine Reihe von Fehlern und Abweichungen vom Unicode-Standard.)
Vor Perl v5.8.0 wurde die Verwendung von "use utf8" verwendet, um zu deklarieren, dass Operationen in der
Der aktuelle Block oder die aktuelle Datei wäre Unicode-fähig. Es wurde festgestellt, dass dieses Modell falsch ist, oder bei
am wenigsten ungeschickt: die "Unicodeness" wird jetzt mit den Daten getragen, anstatt angehängt zu werden
die Operationen. Ab Perl v5.8.0 bleibt nur noch ein Fall, in dem eine explizite "Verwendung"
utf8" benötigt: Wenn Ihr Perl-Skript selbst in UTF-8 kodiert ist, können Sie UTF-8 in Ihrem
Bezeichnernamen und in String- und regulären Ausdrucksliteralen, indem Sie "Utf8 verwenden" sagen.
Dies ist nicht die Standardeinstellung, da Skripte mit älteren 8-Bit-Daten brechen würden. Sehen
utf8.
Perls Unicode Modell
Perl unterstützt sowohl Strings vor 5.6 mit nativen XNUMX-Bit-Bytes als auch Strings von Unicode
Zeichen. Das allgemeine Prinzip ist, dass Perl versucht, seine Daten als XNUMX-Bit-Bytes zu speichern
so lange wie möglich, aber sobald sich Unicodeness nicht vermeiden lässt, werden die Daten
transparent auf Unicode aktualisiert. Vor Perl v5.14.0 war das Upgrade nicht vollständig
transparent (siehe "Der "Unicode-Bug"" in perlunicode) und für Abwärtskompatibilität,
volle Transparenz wird nicht erreicht, es sei denn, "use feature 'unicode_strings'" (siehe Feature) oder
"Use 5.012" (oder höher) ist ausgewählt.
Intern verwendet Perl derzeit entweder den nativen XNUMX-Bit-Zeichensatz der
Plattform (zum Beispiel Latin-1) ist standardmäßig UTF-8, um Unicode-Strings zu codieren.
Wenn alle Codepunkte in der Zeichenfolge 0xFF oder weniger sind, verwendet Perl die native
Acht-Bit-Zeichensatz. Andernfalls wird UTF-8 verwendet.
Ein Benutzer von Perl muss normalerweise nicht wissen oder sich darum kümmern, wie Perl seine
interne Strings, wird aber relevant, wenn Unicode-Strings an einen Stream ausgegeben werden
ohne eine PerlIO-Schicht (eine mit der "Standard"-Kodierung). In einem solchen Fall werden die Rohbytes
intern verwendet (der native Zeichensatz oder UTF-8, wie für jede Zeichenfolge geeignet) wird
verwendet werden, und eine "Wide Character"-Warnung wird ausgegeben, wenn diese Strings a
Zeichen jenseits von 0x00FF.
Zum Beispiel,
perl -e 'printe "\x{DF}\n", "\x{0100}\x{DF}\n"'
erzeugt eine ziemlich nutzlose Mischung aus nativen Bytes und UTF-8 sowie eine Warnung:
Breiter Charakter im Druck bei ...
Um UTF-8 auszugeben, verwenden Sie die Ausgabeschicht ":encoding" oder ":utf8". Vorangestellt
binmode(STDOUT, ":utf8");
zu diesem Beispielprogramm stellt sicher, dass die Ausgabe vollständig UTF-8 ist, und entfernt die
Warnung des Programms.
Sie können die automatische UTF-8-Kennzeichnung Ihrer Standarddatei-Handles aktivieren, Standard "open()"
Layer und @ARGV, indem Sie entweder den Befehlszeilenschalter "-C" oder den "PERL_UNICODE" verwenden.
Umgebungsvariable, siehe perlrun für die Dokumentation des Schalters "-C".
Beachten Sie, dass Perl erwartet, dass andere Software auf die gleiche Weise funktioniert: Wenn Perl
wurde zu der Annahme verleitet, dass STDIN UTF-8 sein sollte, aber dann kommt STDIN von einem anderen
Befehl nicht UTF-8 ist, wird sich Perl wahrscheinlich über das fehlerhafte UTF-8 beschweren.
Alle Funktionen, die Unicode und I/O kombinieren, erfordern auch die Verwendung der neuen PerlIO-Funktion.
Fast alle Perl 5.8-Plattformen verwenden jedoch PerlIO: Sie können sehen, ob Ihre von Ihnen ist
"perl -V" ausführen und nach "useperlio=define" suchen.
Unicode und EBCDIC
Perl 5.8.0 hat Unterstützung für Unicode auf EBCDIC-Plattformen hinzugefügt. Diese Unterstützung durfte
in späteren Versionen verfallen, wurde aber in 5.22 wiederbelebt. Unicode-Unterstützung ist etwas mehr
aufwendig zu implementieren, da zusätzliche Konvertierungen erforderlich sind. Siehe perlebcdic für mehr
Informationen.
Auf EBCDIC-Plattformen ist die interne Unicode-Kodierungsform UTF-EBCDIC anstelle von UTF-8.
Der Unterschied besteht darin, dass UTF-8 "ASCII-sicher" ist, da ASCII-Zeichen in UTF-8 kodieren
wie es ist, während UTF-EBCDIC "EBCDIC-sicher" ist, da alle Grundzeichen (einschließlich
alle mit ASCII-Äquivalenten (wie "A", "0", "%", usw.) sind in beiden gleich
EBCDIC und UTF-EBCDIC. In der Dokumentation wird häufig der Begriff "UTF-8" für UTF-EBCDIC verwendet
sowie. Dies ist in diesem Dokument der Fall.
Erstellen Unicode
Dieser Abschnitt gilt vollständig für Perls ab v5.22. Verschiedene Vorbehalte für früher
Veröffentlichungen finden Sie im Unterabschnitt "Vorbehalte früherer Veröffentlichungen" weiter unten.
Um Unicode-Zeichen in Literalen zu erstellen, verwenden Sie die Notation "\N{...}" in doppelten Anführungszeichen
Saiten:
my $smiley_from_name = "\N{WEIßES LÄCHELNDES GESICHT}";
mein $smiley_from_code_point = "\N{U+263a}";
Ebenso können sie in Literalen für reguläre Ausdrücke verwendet werden
$smiley =~ /\N{WEIßES LÄCHELNDES GESICHT}/;
$smiley =~ /\N{U+263a}/;
Zur Laufzeit können Sie Folgendes verwenden:
Verwenden Sie Zeichennamen ();
mein $hebrew_alef_from_name
= Zeichennamen::string_vianame("HEBRÄISCHER BUCHSTABE ALEF");
my $hebrew_alef_from_code_point = charnames::string_vianame("U+05D0");
Natürlich macht "ord()" das Gegenteil: Es verwandelt ein Zeichen in einen Codepunkt.
Es gibt auch andere Laufzeitoptionen. Sie können "pack()" verwenden:
my $hebrew_alef_from_code_point = pack("U", 0x05d0);
Oder Sie können "chr()" verwenden, obwohl dies im allgemeinen Fall weniger praktisch ist:
$hebrew_alef_from_code_point = chr(utf8::unicode_to_native(0x05d0));
utf8::upgrade($hebrew_alef_from_code_point);
Die "utf8::unicode_to_native()" und "utf8::upgrade()" werden nicht benötigt, wenn das Argument . ist
über 0xFF, also hätte das obige geschrieben werden können als
$hebrew_alef_from_code_point = chr(0x05d0);
da 0x5d0 über 255 liegt.
"\x{}" und "\o{}" können auch verwendet werden, um Codepunkte zur Kompilierzeit in Doppel-
Anführungszeichen-Strings, aber aus Gründen der Abwärtskompatibilität mit älteren Perls gelten die gleichen Regeln wie
mit "chr()" für Codepunkte kleiner als 256.
"utf8::unicode_to_native()" wird verwendet, damit der Perl-Code auf EBCDIC-Plattformen portierbar ist.
Sie können es weglassen, wenn Sie wirklich sicher, dass niemand Ihren Code jemals auf einem nicht-
ASCII-Plattform. Ab Perl v5.22 werden Aufrufe auf ASCII-Plattformen optimiert,
Es gibt also keine Leistungseinbußen beim Hinzufügen. Oder Sie können einfach das andere verwenden
Konstrukte, die es nicht erfordern.
Siehe "Weitere Ressourcen", um all diese Namen und numerischen Codes zu finden.
Früher Releases Vorbehalte
Auf EBCDIC-Plattformen vor v5.22 funktioniert die Verwendung von "\N{U+...}" nicht richtig.
Vor v5.16 Verwendung von "\N{...}" mit einem Zeichennamen (im Gegensatz zu einem "U+..."-Codepunkt)
erforderte ein "use charnames :full".
Vor v5.14 gab es einige Fehler in "\N{...}" mit einem Zeichennamen (im Gegensatz zu a
Codepunkt "U+...").
"charnames::string_vianame()" wurde in v5.14 eingeführt. Davor,
"charnames::vianame()" sollte funktionieren, aber nur wenn das Argument die Form "U+..." hat. Ihre
Die beste Wahl für Runtime-Unicode nach Zeichenname ist wahrscheinlich:
Verwenden Sie Zeichennamen ();
mein $hebrew_alef_from_name
= pack("U", charnames::vianame("HEBRÄISCHER BUCHSTABE ALEF"));
Handling Unicode
Der Umgang mit Unicode ist größtenteils transparent: Verwenden Sie die Strings einfach wie gewohnt.
Funktionen wie "index()", "length()" und "substr()" funktionieren mit Unicode-Zeichen;
reguläre Ausdrücke funktionieren mit Unicode-Zeichen (siehe perlunicode und perlretut).
Beachten Sie, dass Perl Graphem-Cluster als separate Zeichen betrachtet, also zum Beispiel
print length("\N{LATIN GROSSBUCHSTABEN A}\N{KOMBINIERENDER AKUTE AKZENTE}"),
"\n";
gibt 2 aus, nicht 1. Die einzige Ausnahme ist, dass reguläre Ausdrücke "\X" für . haben
passend zu einem erweiterten Graphem-Cluster. (Daher würde "\X" in einem regulären Ausdruck mit dem
gesamte Folge der beiden Beispielzeichen.)
Das Leben ist jedoch nicht ganz so transparent, wenn Sie mit Legacy-Encodings, I/O und . arbeiten
bestimmte Sonderfälle:
Legacy Codierungen
Wenn Sie Altdaten und Unicode kombinieren, müssen die Altdaten auf Unicode aktualisiert werden.
Normalerweise wird davon ausgegangen, dass die Altdaten ISO 8859-1 (oder EBCDIC, falls zutreffend) sind.
Das Modul "Encode" kennt viele Codierungen und verfügt über Schnittstellen für Konvertierungen
zwischen diesen Kodierungen:
benutze Encode 'dekodieren';
$data = decode("iso-8859-3", $data); # Konvertieren von Legacy zu UTF-8
Unicode I / O
Normalerweise schreibt man Unicode-Daten
drucke FH $some_string_with_unicode, "\n";
erzeugt Rohbytes, die Perl zufällig verwendet, um den Unicode-String intern zu codieren.
Die interne Kodierung von Perl hängt vom System ab und davon, welche Zeichen gerade enthalten sind
die Saite zu der Zeit. Wenn sich eines der Zeichen an den Codepunkten 0x100 oder höher befindet, werden Sie
bekommt eine Verwarnung. Um sicherzustellen, dass die Ausgabe explizit in der Codierung wiedergegeben wird, die Sie
Wunsch - und um die Warnung zu vermeiden - öffnen Sie den Stream mit der gewünschten Codierung. Etwas
Beispiele:
FH öffnen, ">:utf8", "Datei";
FH öffnen, ">:encoding(ucs2)", "file";
FH öffnen, ">:encoding(UTF-8)", "file";
FH öffnen, ">:encoding(shift_jis)", "file";
und bei bereits geöffneten Streams verwenden Sie "binmode()":
binmode(STDOUT, ":utf8");
binmode(STDOUT, ":encoding(ucs2)");
binmode(STDOUT, ":encoding(UTF-8)");
binmode(STDOUT, ":encoding(shift_jis)");
Die Übereinstimmung der Codierungsnamen ist lose: Groß-/Kleinschreibung spielt keine Rolle, und viele Codierungen haben
mehrere Decknamen. Beachten Sie, dass der Layer ":utf8" immer genau so angegeben werden muss;
es ist nicht abhängig von der losen Übereinstimmung der Codierungsnamen. Beachten Sie auch, dass derzeit
":utf8" ist für die Eingabe unsicher, da es die Daten akzeptiert, ohne dies zu überprüfen
tatsächlich gültiges UTF-8; Sie sollten stattdessen ":encoding(utf-8)" (mit oder ohne Bindestrich) verwenden.
Siehe PerlIO für die Schicht ":utf8", PerlIO::encoding und Encode::PerlIO für die
":encoding()"-Ebene und Encode::Unterstützt für viele Codierungen, die von "Encode" unterstützt werden
Modul.
Das Einlesen einer Datei, von der Sie wissen, dass sie in Unicode oder Legacy kodiert ist
Encodings verwandelt die Daten in Perls Augen nicht auf magische Weise in Unicode. Das zu tun,
Geben Sie beim Öffnen von Dateien die entsprechende Ebene an
open(my $fh,'<:encoding(utf8)', 'anything');
mein $line_of_unicode = <$fh>;
open(my $fh,'<:encoding(Big5)', 'anything');
mein $line_of_unicode = <$fh>;
Auch die I/O-Layer lassen sich mit dem "offenen" Pragma flexibler spezifizieren. Siehe offen, oder
schau dir das folgende Beispiel an.
benutze open ':encoding(utf8)'; # Standardkodierung für die Eingabe/Ausgabe ist
# UTF-8
öffne X, ">Datei";
X drucken chr(0x100), "\n";
schließen X;
öffne Y, "
printf "%#x\n", ord( ); # dies sollte 0x100 drucken
schließen Y;
Mit dem Pragma "open" können Sie die Ebene ":locale" verwenden
BEGIN { $ENV{LC_ALL} = $ENV{LANG} = 'ru_RU.KOI8-R' }
# das :locale wird die Umgebungsvariablen des Gebietsschemas untersuchen wie
# LC_ALL
benutze open OUT => ':locale'; # russki parusski
open(O, ">koi8");
Drucken O chr(0x430); # Unicode Kyrillischer Kleinbuchstabe A = KOI8-R 0xc1
schließen O;
öffnen (ich, "
printf "%#x\n", ord( ), "\n"; # dies sollte 0xc1 drucken
schließen I;
Diese Methoden installieren einen transparenten Filter im E/A-Stream, der Daten aus dem
angegebene Codierung beim Einlesen aus dem Stream. Das Ergebnis ist immer Unicode.
Das open-Pragma wirkt sich auf alle "open()"-Aufrufe nach dem Pragma aus, indem es Standardebenen setzt.
Wenn Sie nur bestimmte Streams beeinflussen möchten, verwenden Sie explizite Layer direkt im "open()"
Anruf.
Sie können die Codierung eines bereits geöffneten Streams ändern, indem Sie "binmode()" verwenden; siehe "binmode"
in perlfunc.
Das ":locale" funktioniert derzeit nicht mit "open()" und "binmode()", nur mit dem "open"
Pragma. Die Methoden ":utf8" und ":encoding(...)" funktionieren mit allen "open()",
"binmode()" und das "open"-Pragma.
Ebenso können Sie diese I/O-Schichten in Ausgabestreams verwenden, um Unicode automatisch zu konvertieren
in die angegebene Codierung, wenn sie in den Stream geschrieben wird. Zum Beispiel die folgenden
Snippet kopiert den Inhalt der Datei "text.jis" (kodiert als ISO-2022-JP, auch bekannt als JIS) nach
die Datei "text.utf8", kodiert als UTF-8:
open(my $nihongo, '<:encoding(iso-2022-jp)', 'text.jis');
open(mein $unicode, '>:utf8', 'text.utf8');
while (<$nihongo>) { $unicode $_ drucken }
Die Benennung von Codierungen, sowohl durch das "open()" als auch durch das "open" Pragma ermöglicht flexible
Namen: "koi8-r" und "KOI8R" werden beide verstanden.
Gängige Kodierungen, die von ISO, MIME, IANA und verschiedenen anderen Standardisierungen erkannt werden
Organisationen werden anerkannt; eine detailliertere Liste finden Sie unter Encode::Supported.
"read()" liest Zeichen und gibt die Anzahl der Zeichen zurück. "seek()" und "tell()"
arbeiten mit Byte-Zählungen, ebenso wie "sysread()" und "sysseek()".
Beachten Sie, dass aufgrund des Standardverhaltens, bei der Eingabe keine Konvertierung durchzuführen, wenn
Es gibt keine Standardebene, es ist leicht, irrtümlicherweise Code zu schreiben, der sich ständig erweitert a
Datei durch wiederholtes Kodieren der Daten:
# WARNUNG FEHLERHAFTER CODE
öffne F, "Datei";
lokale $/; ## die gesamte Datei mit 8-Bit-Zeichen einlesen
$t = ;
schließen F;
öffne F, ">:encoding(utf8)", "file";
drucke F $t; ## bei Ausgabe in UTF-8 konvertieren
schließen F;
Wenn Sie diesen Code zweimal ausführen, wird der Inhalt des Datei wird zweimal UTF-8 kodiert. Ein "Gebrauch"
open ':encoding(utf8)'" hätte den Fehler vermieden, oder explizit auch das öffnen Datei
zur Eingabe als UTF-8.
HINWEIS: Die Funktionen ":utf8" und ":encoding" funktionieren nur, wenn Ihr Perl mit erstellt wurde
PerlIO, das auf den meisten Systemen die Standardeinstellung ist.
Zeige Unicode As Text
Manchmal möchten Sie Perl-Skalare, die Unicode enthalten, als einfaches ASCII (oder
EBCDIC) Text. Die folgende Subroutine konvertiert ihr Argument so, dass Unicode-Zeichen
mit Codepunkten größer als 255 werden als "\x{...}" angezeigt, Steuerzeichen (wie
"\n") werden als "\x.." und die restlichen Zeichen als sich selbst angezeigt:
sub nice_string {
beitreten("",
map { $_ > 255 # wenn Breitzeichen...
? sprintf("\\x{%04X}", $_) # \x{...}
: chr($_) =~ /[[:cntrl:]]/ # else if Steuerzeichen...
? sprintf("\\x%02X", $_) # \x..
: quotemeta(chr($_)) # sonst zitiert oder als sich selbst
} unpack("W*", $_[0])); # Unicode-Zeichen entpacken
}
Zum Beispiel,
nice_string("foo\x{100}bar\n")
Gibt die Zeichenfolge zurück
'foo\x{0100}bar\x0A'
die druckfertig ist.
("\\x{}" wird hier anstelle von "\\N{}" verwendet, da Sie höchstwahrscheinlich sehen möchten, was
die nativen Werte sind.)
Spezial Projekte
· Bit-Komplement-Operator ~ And vec()
Der Bitkomplementoperator "~" kann überraschende Ergebnisse liefern, wenn er auf Zeichenfolgen verwendet wird
die Zeichen mit Ordinalwerten über 255 enthalten. In einem solchen Fall sind die Ergebnisse
stimmt mit der internen Kodierung der Zeichen überein, aber nicht mit viel anderem. So
mach das nicht. Ähnlich für "vec()": Sie arbeiten auf dem intern codierten
Bitmuster der Unicode-Zeichen, nicht auf den Codepunktwerten, was sehr
wahrscheinlich nicht das was du willst.
· Einblick in die interne Kodierung von Perl
Normale Benutzer von Perl sollten sich nicht darum kümmern, wie Perl einen bestimmten Unicode-String codiert
(weil die normalen Möglichkeiten, mit Unicode an den Inhalt eines Strings zu gelangen - über die Eingabe
und Ausgabe – sollte immer über explizit definierte I/O-Layer erfolgen). Aber wenn es sein muss,
Es gibt zwei Möglichkeiten, hinter die Kulissen zu schauen.
Eine Möglichkeit, einen Blick in die interne Kodierung von Unicode-Zeichen zu werfen, ist die Verwendung von
"unpack("C*", ...", um die Bytes der Zeichenfolgencodierung zu erhalten, oder
"unpack("U0..", ...)", um die Bytes der UTF-8-Kodierung zu erhalten:
# dies druckt c4 80 für die UTF-8-Bytes 0xc4 0x80
print join(" ", unpack("U0(H2)*", pack("U", 0x100))), "\n";
Eine andere Möglichkeit wäre die Verwendung des Devel::Peek-Moduls:
perl -MDevel::Peek -e 'Dump(chr(0x100))'
Das zeigt das Flag "UTF8" in FLAGS und sowohl die UTF-8-Bytes als auch die Unicode-Zeichen in
"PV". Siehe auch später in diesem Dokument die Diskussion über "utf8::is_utf8()"
Funktion.
Erweitert Themen
· String-Äquivalenz
Die Frage der String-Äquivalenz wird in Unicode etwas kompliziert: Was tun Sie?
meinst du mit "gleich"?
(Ist "LATIN GROSSBUCHSTABE A MIT AKUT" gleich "LATIN GROSSBUCHSTABE A"?)
Die kurze Antwort ist, dass Perl standardmäßig nur Äquivalenz ("eq", "ne") vergleicht
an Codepunkten der Zeichen. Im obigen Fall lautet die Antwort nein (weil 0x00C1
!= 0x0041). Aber manchmal sollten alle GROSSBUCHSTABEN A als gleich oder sogar gleich angesehen werden
A ist auf jeden Fall.
Die lange Antwort ist, dass Sie die Zeichennormalisierung und Groß-/Kleinschreibung berücksichtigen müssen
Probleme: siehe Unicode::Normalize, Unicode Technical Report #15, Unicode Normalization
Formenhttp://www.unicode.org/unicode/reports/tr15> und Abschnitte zur Fallzuordnung in
der Unicode-Standardhttp://www.unicode.org>.
Ab Perl 5.8.0 ist die "Full" Case-Folding von Wohncontainer Zuordnungen/Sondergehäuse is
implementiert, aber Fehler bleiben in "qr//i" mit ihnen, meist behoben von 5.14, und
im Wesentlichen vollständig bis 5.18.
· String-Sortierung
Die Leute mögen es, wenn ihre Strings schön sortiert sind – oder, wie Unicode-Sprache sagt, sortiert.
Aber noch einmal, was meinst du mit kollationieren?
(Kommt "LATIN GROSSBUCHSTABE A MIT AKUT" vor oder nach "LATIN GROSSBUCHSTABE A
MIT GRAB"?)
Die kurze Antwort ist, dass Perl standardmäßig Strings vergleicht ("lt", "le", "cmp", "ge",
"gt") basiert nur auf den Codepunkten der Zeichen. Im obigen Fall die Antwort
ist "nach", da 0x00C1 > 0x00C0.
Die lange Antwort ist, dass "es kommt darauf an" und eine gute Antwort kann nicht ohne gegeben werden
den sprachlichen Kontext (zumindest) kennen. Siehe Unicode::Collate und Unicode
Vergleich Algorithmus <http://www.unicode.org/unicode/reports/tr10/>
Weitere Anwendungsbereiche
· Zeichenbereiche und Klassen
Zeichenbereiche in in Klammern stehenden regulären Ausdrücken (zB "/[az]/")
und im Operator "tr///" (auch bekannt als "y///") sind sie nicht auf magische Weise Unicode-fähig.
Dies bedeutet, dass "[A-Za-z]" nicht auf magische Weise "alle alphabetisch" bedeutet
Buchstaben" (nicht, dass dies auch für 8-Bit-Zeichen bedeutet; für diese, wenn Sie es sind
Verwenden Sie Gebietsschemas (perllocale), verwenden Sie "/[[:alpha:]]/"; und wenn nicht, verwenden Sie die 8-Bit-Aware
Eigenschaft "\p{alpha}").
Alle Eigenschaften, die mit "\p" (und deren Umkehrung "\P") beginnen, sind eigentlich Zeichen
Klassen, die Unicode-fähig sind. Es gibt Dutzende davon, siehe Perluniprops.
Ab v5.22 können Sie Unicode-Codepunkte als Endpunkte von regulären
Ausdrucksmusterzeichenbereiche, und der Bereich umfasst den gesamten Unicode-Code
Punkte, die zwischen diesen Endpunkten liegen, einschließlich.
qr/ [\N{U+03]-\N{U+20}] /x
enthält die Codepunkte "\N{U+03}", "\N{U+04}", ..., "\N{U+20}".
(Es ist geplant, dieses Verhalten auf Bereiche in "tr///" in Perl v5.24 auszudehnen.)
· String-to-Number-Konvertierungen
Unicode definiert neben den
vertraute 0 bis 9, wie die arabischen und indischen Ziffern. Perl unterstützt keine String-
in Zahlenumwandlung für andere Ziffern als ASCII 0 bis 9 (und ASCII "a" in "f" für
hexadezimal). Um sichere Konvertierungen von einem beliebigen Unicode-String zu erhalten, verwenden Sie "Anzahl()"Im
Unicode::UCD.
Fragen Bei Antworten
· Werden meine alten Skripte kaputt gehen?
Sehr wahrscheinlich nicht. Es sei denn, Sie erzeugen irgendwie Unicode-Zeichen, alt
Verhalten soll erhalten bleiben. Über das einzige Verhalten, das sich geändert hat und das
könnte mit der Generierung von Unicode beginnen, ist das alte Verhalten von "chr()", bei dem ein
Argument mehr als 255 erzeugte ein Zeichen modulo 255. "chr(300)", war zum Beispiel
gleicht "chr(45)" oder "-" (in ASCII), jetzt ist es lateinischer Großbuchstabe I mit Breve.
· Wie kann ich dafür sorgen, dass meine Skripte mit Unicode funktionieren?
Es sollte sehr wenig Arbeit erforderlich sein, da sich nichts ändert, bis Sie Unicode generieren
Daten. Das Wichtigste ist, Eingaben als Unicode zu erhalten; siehe dazu früher
E/A-Diskussion. Um eine vollständige nahtlose Unicode-Unterstützung zu erhalten, fügen Sie "Funktion verwenden" hinzu
'unicode_strings'" (oder "use 5.012" oder höher) in Ihr Skript.
· Woher weiß ich, ob mein String in Unicode ist?
Sie sollten sich nicht darum kümmern. Aber Sie können, wenn Ihr Perl vor 5.14.0 ist oder nicht
angegeben "use feature 'unicode_strings'" oder "use 5.012" (oder höher), weil sonst
die Regeln für die Codepunkte im Bereich 128 bis 255 sind je nach
ob die Zeichenfolge, in der sie enthalten sind, in Unicode ist oder nicht. (Siehe "Wenn Unicode
Passiert nicht" in Perlunicode.)
Um festzustellen, ob eine Zeichenfolge in Unicode vorliegt, verwenden Sie:
print utf8::is_utf8($string) ? 1 : 0, "\n";
Beachten Sie jedoch, dass dies nicht bedeutet, dass eines der Zeichen in der Zeichenfolge erforderlich ist
UTF-8-codiert oder dass eines der Zeichen Codepunkte größer als 0xFF (255) hat
oder sogar 0x80 (128), oder dass die Zeichenfolge überhaupt Zeichen enthält. Alle "is_utf8()"
ist, den Wert des internen Flags "utf8ness" zurückzugeben, das an den $string angehängt ist.
Wenn das Flag ausgeschaltet ist, werden die Bytes im Skalar als Einzelbyte-Kodierung interpretiert.
Wenn das Flag aktiviert ist, werden die Bytes im Skalar als (variable-Länge,
potenziell Multibyte) UTF-8-kodierte Codepunkte der Zeichen. Bytes zu a . hinzugefügt
UTF-8-codierte Zeichenfolgen werden automatisch auf UTF-8 aktualisiert. Wenn gemischt Nicht-UTF-8 und
UTF-8-Skalare werden zusammengeführt (doppelte Anführungszeichen, explizite Verkettung oder
printf/sprintf-Parametersubstitution), wird das Ergebnis UTF-8-kodiert, als ob Kopien
der Byte-Strings wurden auf UTF-8 aktualisiert: zum Beispiel
$a = "ab\x80c";
$b = "\x{100}";
drucke "$a = $b\n";
die Ausgabezeichenfolge wird UTF-8-codiert "ab\x80c = \x{100}\n", aber $a bleibt Byte-
codiert.
Manchmal müssen Sie möglicherweise wirklich die Bytelänge einer Zeichenfolge kennen, anstatt die
Zeichenlänge. Verwenden Sie dazu entweder die Funktion "Encode::encode_utf8()" oder die
Pragma "bytes" und Funktion "length()":
mein $unicode = chr(0x100);
print length($unicode), "\n"; # druckt 1
codieren erforderlich;
print length(Encode::encode_utf8($unicode)),"\n"; # druckt 2
Byte verwenden;
print length($unicode), "\n"; # druckt auch 2
# (das 0xC4 0x80 des UTF-8)
keine Bytes;
· Wie finde ich heraus, welche Codierung eine Datei hat?
Sie können Encode::Guess ausprobieren, aber es gibt eine Reihe von Einschränkungen.
· Wie erkenne ich Daten, die in einer bestimmten Kodierung ungültig sind?
Verwenden Sie das Paket "Encode", um zu versuchen, es zu konvertieren. Zum Beispiel,
Verwenden Sie die Codierung 'decode_utf8';
if (eval { decode_utf8($string, Encode::FB_CROAK); 1}) {
# $string ist gültig utf8
} Else {
# $string ist ungültig utf8
}
Oder verwenden Sie "unpack", um zu versuchen, es zu entschlüsseln:
Warnungen verwenden;
@chars = unpack("C0U*", $string_of_bytes_that_I_think_is_utf8);
Bei Ungültigkeit wird eine Warnung "Fehlerhaftes UTF-8-Zeichen" ausgegeben. Das "C0" bedeutet "Prozess"
die Zeichenfolge Zeichen pro Zeichen". Ohne das würde "unpack("U*", ...)" funktionieren
im Modus "U0" (der Standardwert, wenn die Formatzeichenfolge mit "U" beginnt) und es würde zurückkehren
die Bytes, aus denen die UTF-8-Kodierung der Zielzeichenfolge besteht, etwas, das
immer arbeiten.
· Wie konvertiere ich Binärdaten in eine bestimmte Kodierung oder umgekehrt?
Dies ist wahrscheinlich nicht so nützlich, wie Sie vielleicht denken. Normalerweise sollte das nicht nötig sein.
In gewisser Hinsicht macht das, was Sie fragen, nicht viel Sinn: Codierungen sind für
Zeichen und Binärdaten sind keine "Zeichen", also "Daten" in einige umwandeln
Codierung ist nur dann sinnvoll, wenn Sie wissen, in welchem Zeichensatz und welcher Codierung die
Binärdaten sind in, in diesem Fall sind es nicht nur Binärdaten, oder?
Wenn Sie eine Rohfolge von Bytes haben, von denen Sie wissen, dass sie über a . interpretiert werden sollten
bestimmten Kodierung können Sie "Encode" verwenden:
Verwenden Sie 'von_bis' codieren;
from_to($data, "iso-8859-1", "utf-8"); # von lateinisch-1 bis utf-8
Der Aufruf von "from_to()" ändert die Bytes in $data, aber nichts Wesentliches über die
Die Natur des Strings hat sich in Bezug auf Perl geändert. Vorher und nachher
Beim Aufruf enthält die Zeichenfolge $data nur einen Haufen von 8-Bit-Bytes. Soweit Perl ist
betroffen, bleibt die Kodierung des Strings als "systemnative 8-Bit-Bytes" erhalten.
Sie könnten dies mit einem fiktiven 'Übersetzen'-Modul in Verbindung bringen:
einen Übersetzer benutzen;
meine $phrase = "Ja";
Übersetzen::from_to($phrase, 'englisch', 'deutsch');
##-Satz enthält jetzt "Ja"
Der Inhalt der Zeichenfolge ändert sich, jedoch nicht die Art der Zeichenfolge. Perl nicht
wissen nach dem Aufruf nicht mehr als vorher, dass der Inhalt des Strings die
positiv.
Zurück zum Konvertieren von Daten. Wenn Sie Daten im nativen 8-Bit-Format Ihres Systems haben (oder möchten)
Kodierung (zB Latin-1, EBCDIC, etc.), können Sie mit pack/unpack konvertieren in/von
Unicode.
$native_string = pack("W*", unpack("U*", $Unicode_string));
$Unicode_string = pack("U*", unpack("W*", $native_string));
Wenn Sie eine Folge von Bytes haben, kennt ist gültiges UTF-8, aber Perl kennt es noch nicht,
Sie können auch Perl zu einem Gläubigen machen:
Verwenden Sie die Codierung 'decode_utf8';
$Unicode = decode_utf8($bytes);
oder:
$Unicode = pack("U0a*", $bytes);
Die Bytes, aus denen eine UTF-8-Sequenz besteht, finden Sie mit
@bytes = unpack("C*", $Unicode_string)
und Sie können wohlgeformten Unicode erstellen mit
$Unicode_string = pack("U*", 0xff, ...)
· Wie zeige ich Unicode an? Wie gebe ich Unicode ein?
Sehenhttp://www.alanwood.net/unicode/> und
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
· Wie funktioniert Unicode mit traditionellen Gebietsschemata?
Wenn Ihr Gebietsschema ein UTF-8-Gebietsschema ist, funktioniert Perl ab Perl v5.20 gut für alle
Kategorien außer "LC_COLLATE", die sich mit der Sortierung befassen, und dem "cmp"-Operator.
Für andere Gebietsschemata können Sie ab Perl 5.16 angeben
Verwenden Sie das Gebietsschema ':not_characters';
damit Perl gut damit arbeitet. Der Haken ist, dass Sie aus dem übersetzen müssen
locale-Zeichensatz zu/von Unicode selbst. Siehe "Unicode I/O" oben für die Vorgehensweise
benutze open ':locale';
Um dies zu erreichen, finden Sie alle Details in "Unicode and UTF-8" in perlocale,
einschließlich Fallstricke, die passieren, wenn Sie ":not_characters" nicht angeben.
Hexadecimal Bewertung
Der Unicode-Standard bevorzugt die Verwendung der hexadezimalen Notation, da dies deutlicher zu sehen ist
die Aufteilung von Unicode in Blöcke von 256 Zeichen. Hexadezimal ist auch einfach kürzer
als dezimal. Sie können auch die dezimale Notation verwenden, aber lernen, nur hexadezimal zu verwenden
macht das Leben einfacher mit dem Unicode-Standard. Die Notation "U+HHHH" verwendet hexadezimal, für
Beispiel.
Das Präfix "0x" bedeutet eine Hexadezimalzahl, die Ziffern sind 0-9 und af (oder AF, Fall
ist egal). Jede hexadezimale Ziffer repräsentiert vier Bits oder ein halbes Byte. "drucken
0x..., "\n"" zeigt eine hexadezimale Zahl in Dezimalform und "printf "%x\n", $decimal" wird
eine Dezimalzahl in hexadezimal anzeigen. Wenn Sie nur die "Hex-Ziffern" einer Hexadezimalzahl haben
Nummer können Sie die Funktion "hex()" verwenden.
0x0009, "\n" drucken; # 9
drucke 0x000a, "\n"; # 10
0x000f, "\n" drucken; # fünfzehn
0x0010, "\n" drucken; # 16
0x0011, "\n" drucken; # 17
0x0100, "\n" drucken; # 256
0x0041, "\n" drucken; # 65
printf "%x\n", 65; # 41
printf "%#x\n", 65; # 0x41
print hex("41"), "\n"; # 65
Des Weiteren Ressourcen
· Unicode-Konsortium
<http://www.unicode.org/>
· Unicode-FAQ
<http://www.unicode.org/unicode/faq/>
· Unicode-Glossar
<http://www.unicode.org/glossary/>
· Empfohlene Leseliste für Unicode
Das Unicode-Konsortium hat eine Liste von Artikeln und Büchern, von denen einige viel sagen
tiefergehende Behandlung von Unicode:http://unicode.org/resources/readinglist.html>
· Nützliche Unicode-Ressourcen
<http://www.unicode.org/unicode/onlinedat/resources.html>
· Unicode- und mehrsprachige Unterstützung in HTML, Schriftarten, Webbrowsern und anderen Anwendungen
<http://www.alanwood.net/unicode/>
· UTF-8 und Unicode FAQ für Unix/Linux
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
· Alte Zeichensätze
<http://www.czyborra.com/>http://www.eki.ee/letter/>
· Sie können verschiedene Informationen aus den Unicode-Datendateien mit dem
Modul "Unicode::UCD".
UNICODE IN ÄLTER PERLEN
Wenn Sie Ihr Perl nicht auf 5.8.0 oder höher aktualisieren können, können Sie immer noch etwas Unicode ausführen
Verarbeitung mit den Modulen "Unicode::String", "Unicode::Map8" und "Unicode::Map",
bei CPAN erhältlich. Wenn Sie den GNU-Recode installiert haben, können Sie auch die Perl
Frontend "Convert::Recode" für Zeichenkonvertierungen.
Im Folgenden finden Sie schnelle Konvertierungen von ISO 8859-1 (Latin-1) Bytes in UTF-8 Bytes und
zurück, der Code funktioniert auch mit älteren Perl 5-Versionen.
# ISO 8859-1 bis UTF-8
s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg;
# UTF-8 nach ISO 8859-1
s/([\xC2\xC3])([\x80-\xBF])/chr(ord($1)<<6&0xC0|ord($2)&0x3F)/eg;
Verwenden Sie perluniintro online mit den onworks.net-Diensten