Schrift
[thread]11627[/thread]

Unicode Zeichen in einer Regexp matchen?



<< >> 4 Einträge, 1 Seite
johann_p
 2008-04-12 11:39
#108252 #108252
User since
2008-04-03
3 Artikel
BenutzerIn
[default_avatar]
Was ist die korrekte und portable Methode, Unicode Zeichen in einer Regexp zu matchen?

Zum Beispiel: der long-dash hat in UTF-8 den 3-Byte code 0xE2 0x80 0x95.
Ich habe das mal mit /\xe2\x80\x95/ gemacht, aber funktioniert das auch sicher auf allen Plattformen, unabhängig von Endedness usw? Wirkt sich Endedness überhaupt auf Mehrbytesequenzen aus?

Was ist in einer perl regexp der Unterschied zwischen /\xe2\x80/ und /\x{e280}?
Kann 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?
sid burn
 2008-04-12 18:31
#108272 #108272
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
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.

Quote
Zum 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.

Quote
Kann 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.

Code: (dl )
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
pq
 2008-04-12 18:49
#108276 #108276
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
unverzichtbar beim debuggen finde ich hier auch CPAN:Devel::Peek. damit sieht man
auf einen blick, was eine variable enthält und ob sie das utf8-flag hat.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
moritz
 2008-04-13 01:21
#108292 #108292
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Die kurze Antwort: durch Encode::decode laufen lassen, und den entsprechenden Codepoint matchen.

Die lange Antwort: Charsets und Unicode in Perl
<< >> 4 Einträge, 1 Seite



View all threads created 2008-04-12 11:39.