Frage

Ich bin Suche nach einem Weg nur vollständig zusammengesetzte Zeichen in einem Unicode-String entsprechen.

ist abhängig von locale in jedem regulären Ausdruck Implementierung [:print:], die diese Zeichenklasse enthält? Zum Beispiel wird es japanischen Charakter entspricht ‚あ‘, da es kein Steuerzeichen ist oder [:print:] immer gehen zu ASCII-Codes 0x20 bis 0x7E sein?

Gibt es eine Zeichenklasse, einschließlich Perl REs, die verwendet werden können, etwas anderes als ein Steuerzeichen entsprechen? Wenn [:print:] nur Zeichen in ASCII-Bereich umfasst würde ich annehmen, [:cntrl:] auch der Fall ist.

War es hilfreich?

Lösung

echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[$_]"; print /[[:print:]]/ ? "YES" : "NO"'

Das meist funktioniert, obwohl es eine Warnung über einen weiten Charakter erzeugt. Aber es gibt Ihnen die Idee: Sie sicher sein, müssen Sie mit einem echten Unicode-String zu tun hat (check utf8 :: is_utf8). Oder einfach nur überprüfen perlunicode überhaupt - das ganze Thema macht noch meinen Kopf drehen

.

Andere Tipps

Ich glaube, Sie wollen nicht, oder brauchen Locales für das, aber, sondern Unicode. Wenn Sie eine Textzeichenfolge decodiert, \w Wortzeichen in jeder Sprache übereinstimmen, passt \d nicht nur 0..9 aber jeder Unicode-digit etc. Regexes können Sie Unicode-Eigenschaften mit \p{PropertyName} abfragen. Besonders interessant für Sie könnten \p{Print} werden. Hier ist eine Liste aller Unicode-Zeicheneigenschaften verfügbar .

Ich schrieb einen Artikel über die Grundlagen und Feinheiten von Unicode und Perl es sollten Sie eine gute Idee, auf das, was zu tun, dass perl-Zeichenfolge als eine Folge von Zeichen erkennen, nicht nur eine Folge von Bytes.

Update: mit Unicode Sie nicht sprachabhängige Verhalten bekommen, sondern vernünftige Default unabhängig von der Sprache. Dies kann oder kann nicht sein, was Sie wollen, aber zur Unterscheidung von priintable / Steuerzeichen Ich sehe nicht, warum Sie sprachabhängige Verhalten bräuchten.

\X entspricht einem vollständig zusammengesetzt Zeichen (Sequenz). Beweis:

#!/usr/bin/env perl
use 5.010;
use utf8;
use Encode qw(encode_utf8);

for my $string (qw(あ ご ご), "\x{3099}") {
    say encode_utf8 sprintf "%s $string", $string =~ /\A \X \z/msx ? 'ok' : 'nok';
}

Die Testdaten sind: ein normales Zeichen, ein präkombiniert Charakter, eine Kombinationszeichenfolge und eine Kombination von Zeichen (die auf seinem eigenen „zählt nicht“, eine Vereinfachung des Kapitels 3 von Unicode)

Ersatz \X mit [[:print:]] zu sehen, dass Tanktalus' Antwort falsche Übereinstimmungen in den letzten beiden Fällen erzeugt.

Ja, sind diese Ausdrücke locale abhängig.

Sie können immer die Zeichenklasse [^[:cntrl:]] verwenden nicht-Steuerzeichen entsprechen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top