wide charset und normal charset

04/04/2012 - 18:19 von Nils Müller | Report spam
Hallo,

ich habe folgendes Problem. Ich möchte eine Zeichenkette ab einer bestimmten Position
abschneiden. In unterem Beispiel, nach dem siebten Zeichen:

my $orig_name = "おもしろネタ速報";
my $name_size_max = "7";

my $name = wide_char($orig_name);

sub wide_char
{
my $orig_name = $_[0];
my $name = decode('UTF-8', $orig_name);
$name_size_max = int($name_size_max / 2)+1;
$name = substr($name,0,$name_size_max);
return $name;
}

Meine obige Routine funktioniert soweit. Falls ich aber lateinische
Zeichen mit in der Zeichenkette habe, dann funktioniert das nicht
mehr korrekt > my $orig_name = "testおもしろネタ速報";

Ich weiss auch, dass es an der Rundung mittels int() liegt. Aber
ich finde keine Lösung für das Problem. Hat jemand eine Idee?
 

Lesen sie die antworten

#1 Bjoern Hoehrmann
04/04/2012 - 20:21 | Warnen spam
* Nils Müller wrote in de.comp.lang.perl.misc:
my $name_size_max = "7";

my $name = wide_char($orig_name);

sub wide_char
{
my $orig_name = $_[0];
my $name = decode('UTF-8', $orig_name);
$name_size_max = int($name_size_max / 2)+1;
$name = substr($name,0,$name_size_max);
return $name;
}

Meine obige Routine funktioniert soweit.



"Wide character" ist ein überholter Begriff aus den 1990ern; du scheinst
irgendwie davon auszugehen, dass diese Zeichen doppelt so breit sind wie
"normale" Zeichen. Das ist nicht der Fall, ein "ö" in $name ist genauso
"breit" wie ein "o" zumindest was substr und length und derlei angeht.
Das liegt vor allem an decode(), würdest du das nicht benutzen dann wàre
ein "ö" doppelt so lang wie ein "o", das Euro-Zeichen drei mal so lang,
und diverse asiatische Schriftzeichen vier mal so lang. In bytes, wohl-
gemerkt, und ohne das decode() würde Perl grob gesagt die Zeichenkette
als Byte-Kette interpretieren. Wenn du $name_size_max einfach auf `7`
làsst, dann funktioniert das Skript wie "gewünscht".
Björn Höhrmann · mailto: · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Ähnliche fragen