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:
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:
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 $_;
}
}