Wie passe ich nur vollständig zusammengesetzte Zeichen in einer Unicode-Zeichenfolge in Perl an?

8

Ich suche nach einer Möglichkeit, nur vollständig zusammengesetzte Zeichen in einer Unicode-Zeichenfolge abzugleichen.

Ist [:print:] abhängig von der Ländereinstellung in jeder Implementierung eines regulären Ausdrucks, die diese Zeichenklasse enthält? Passt es beispielsweise zum japanischen Zeichen "あ", da es kein Steuerzeichen ist, oder ist [:print:] immer ASCII-Codes 0x20 bis 0x7E?

Gibt es eine Zeichenklasse, einschließlich Perl-REs, die verwendet werden kann, um irgendetwas anderes als ein Steuerzeichen zu finden? Wenn [:print:] nur Zeichen im ASCII-Bereich enthält, würde ich auch [:cntrl:] verwenden.

    
dreamlax 15.10.2008, 03:10
quelle

5 Antworten

6
%Vor%

Dies funktioniert meistens, obwohl es eine Warnung über ein breites Zeichen erzeugt. Aber es gibt Ihnen die Idee: Sie müssen sicher sein, dass es sich um eine echte Unicode-Zeichenfolge handelt (überprüfen Sie utf8 :: is_utf8). Oder überprüfe einfach perlunicode - das ganze Thema noch lässt meinen Kopf drehen.

    
Tanktalus 15.10.2008, 05:27
quelle
5

Ich denke, dass Sie dafür keine Gebietsschemata benötigen oder benötigen, sondern Unicode. Wenn Sie eine Textzeichenfolge entschlüsselt haben, stimmt \w mit den Wortzeichen in jeder Sprache überein, \d stimmt nicht mit 0..9 überein, sondern mit jeder Unicode-Zahl usw. In Regexes können Sie Unicode-Eigenschaften mit \p{PropertyName} abfragen. Besonders interessant für dich könnte \p{Print} sein. Hier finden Sie eine Liste aller verfügbaren Unicode-Zeicheneigenschaften .

Ich habe einen Artikel über die Grundlagen und Feinheiten von Unicode und Perl geschrieben , er sollte Ihnen einen geben Eine gute Idee, was zu tun, dass Perl wird Ihre Zeichenfolge als eine Folge von Zeichen, nicht nur eine Folge von Bytes erkennen.

Update: Mit Unicode erhalten Sie kein sprachabhängiges Verhalten, sondern normale Standardeinstellungen, unabhängig von der Sprache. Dies kann oder kann nicht sein, was Sie wollen, aber für die Unterscheidung von priintable / Steuerelement Charakter sehe ich nicht, warum Sie sprachabhängiges Verhalten benötigen.

    
moritz 15.10.2008 06:48
quelle
4

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

%Vor%

Die Testdaten sind: ein normales Zeichen, ein vorkombiniertes Zeichen, eine kombinierende Zeichenfolge und ein kombinierendes Zeichen (das "alleine nicht zählt", eine Vereinfachung von Unicode-Kapitel 3).

>

Ersetze \X mit [[:print:]] , um zu sehen, dass die Antwort von Tanktalus für die letzten beiden Fälle falsche Treffer liefert.

    
daxim 07.01.2010 23:12
quelle
2

Ja, diese Ausdrücke sind abhängig vom Gebietsschema.

    
Jonathan Leffler 15.10.2008 03:11
quelle
1

Sie können immer die Zeichenklasse [^[:cntrl:]] verwenden, um Nicht-Steuerzeichen zu finden.

    
Adam Rosenfield 15.10.2008 03:26
quelle