Hi, die korrekte und Portable Methode ein Unicode Zeichen zu matchen ist wie du schon sagtest mit \N{...} damit dir die ganzen Namen zur Verfügung stehen musst du das pragma "use charnames ':full';" laden.
QuoteZum Beispiel: der long-dash hat in UTF-8 den 3-Byte code 0xE2 0x80 0x95.
Um dir noch zu erklärung warum dieser Weg unportabel ist.
Unicode definiert nur Zeichen zu Codepoints (z.B: U+1234). Die Codepoints selber wiederrum können beliebig binär Codiert werden. UTF-8 ist eine Codierung, es gibt aber noch andere Unicode Codierungen wie UTF-16, UTF-32. Das gleiche Unicode Zeichen kann also unter den unterschiedlichen Codierungen anders binär aussehen. Direkt also mit \x{} die binäre darstellung zu matchen ist nicht gut.
Weiterhin würde es nichtmal korrekt gehen wenn nur UTF-8 genutzt würde. Den das selbe Zeichen kann auch in UTF-8 mehrere Codierungen haben.
QuoteKann man Unicode Zeichen auch mit /\N{name}/ matchen und wie findet man raus was "name" für den Long Dash ist und welche "name"s überhaupt unterstützt werden?
Wenn du das Zeichen auf der Tastatur eintippen kannst. Dann kannst du "Unicode::UCD" nutzen um dir die Unicode Daten anzeigen zu lassen. Hieraus kannst du dann die benötigten Daten auslesen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
# Core Module
use strict;
use warnings;
use utf8;
use open ':utf8';
use open ':std';
use charnames ':full';
use Unicode::UCD qw(charinfo);
use Data::Dumper;
my $char = 'ä';
print Dumper charinfo(ord $char);
my $string = 'hälö';
if ( $string =~ m/ ( \N{LATIN SMALL LETTER A WITH DIAERESIS} ) /xms ) {
print "Matched: [$1]\n";
}
Dieses Beispiel gibt zu anfang mithilfe der charinfo() Methode die Informationen des Zeichens "ä" aus. charinfo muss man den Codepoint übergeben. Dieses bekommst du mit "ord()" heraus. charinfo selber gibt dann eine hash struktur mit den Infos zurück die ich sofort Dumpe.
Aus diesen Hash habe ich dann den Langen Namen abgelesen und dir gezeigt wie du es in der Regex einbauen kannst.
Ansonsten sind die "use" Statements zeimlich wichtig damit das ganze Funktioniert. Solltest du nicht Wissen was die einzelnen tuen dann lese selber nach oder Frag. ;)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de