Schrift
[thread]8457[/thread]

Steuerzeichen aus einem Text auslesen



<< >> 3 Einträge, 1 Seite
Gast Gast
 2006-10-28 13:16
#71242 #71242
Hallo Leute!

Ich habe folgendes Problem.

Ich muss ein PERL Programm schreiben, dass aus japanischen Webseiten bestimmte Zeichen erkennt und kodiert.

Habe bis jetzt herausgefunden, dass jedes dieser Zeichen als Leading Byte den Wert "\x83" hat. Das nächste Byte ist dann der eigentliche Zeichenwert, z.b.: "\x4a" für die Silbe "KA".

Mein Problem ist nun, dass ich nicht weiß wie ich in PERL eine Datei so einlesen kann, dass ich dann auf diese Zeichen vergleichen kann. Das heißt, sobald ich ein "\x83" finde, schaue ich beim Wert des nächsten Bytes in einem Hash nach und gebe den passenden Buchstaben/Silbe/Wort dazu aus.

Kann mir da jemand weiterhelfen? Hoffe ich habe mein Problem verständlich geschildert! ;)

Herzlichen Dank im Voraus!

Lg
Stefan
esskar
 2006-10-28 13:35
#71243 #71243
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
such mal nach charset, Encode und HTML::Parser
ptk
 2006-10-29 23:34
#71244 #71244
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Damit die perl.de-Leser keinen Vorteil haben, hier nochmal meine Antwort in der besseren Community:

Ich würde hier vorzugsweise zu den exzellenten Encoding/Charset-Möglichkeiten, die perl5.8.x bietet, greifen. Ich nehme an, dass es sich beim Zeichensatz um shiftjis oder etwas Ähnliches handelt (eine komplette Liste der in perl verfügbaren Zeichensätze kann man sich mit "piconv -l" ausgeben lassen). Dann kannst du den Input in die Perl-interne Unicode-Repräsentation wie folgt konvertieren:
Code: (dl )
1
2
use Encode qw(decode);
$string_perl_intern = decode("shiftjis", $string_japanisches_encoding);

Jetzt könntest du z.B. das charnames-Module (Standard-Perl) oder das Text::Unicode-Modul (von CPAN) verwenden. Text::Unidecode ist recht einfach zu nutzen, einfach die Manpage lesen. Bei charnames könnte man den folgenden Trick verwenden:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use charnames ();
binmode STDOUT, ":utf8"; # nicht unbedingt nötig
my $string = "bla foo \x{30a1}\x{30a2}\x{30AB} bar"; # die \x{....}-Zeichen bekommst du automatisch bei der Konvertierung mit Encode::decode
for (split //, $string) {
my $charname = charnames::viacode(ord $_);
if ($charname =~ /^KATAKANA LETTER (SMALL )?(.*)/) {
my $small = $1;
my $translit = $2;
if ($small) {
print lc $translit;
} else {
print ucfirst lc $translit;
}
} else {
print $_;
}
}
<< >> 3 Einträge, 1 Seite



View all threads created 2006-10-28 13:16.