Von Unicode nach iso-8859-1
Meise2000
- perl
Hallo,
ich habe ein Problem: Ich verwende den XML-Parser von Perl, der intern alle Zeichen als Unicode auswertet. Da es Darstellungsprobleme gibt, muss ich alle Strings in das iso-8859-1 Format verwandeln. Unter:
http://www.xml.com/pub/a/2000/04/26/encodings/index.html?page=2
wird beschrieben, dass man das ganz easy mit dem Befehl:
$string =~ tr/\0-\xff//UC;
machen kann. Lokal funktioniert auch alles einwandfrei. Jedoch klappt das auf den Servern meines Providers nicht. Ich bekomme immer einen 500er Error. Nehme ich die Optionsparameter (UC) weg, so klappt alles bestens... Habt ihr eine Ahnung, woran das liegen kann? Muss dafür ein bestimmtes Modul installiert sein?
Danke,
Meise2000
Halihallo Meise2000
machen kann. Lokal funktioniert auch alles einwandfrei. Jedoch klappt das auf den Servern meines Providers nicht. Ich bekomme immer einen 500er Error. Nehme ich die Optionsparameter (UC) weg, so klappt alles bestens... Habt ihr eine Ahnung, woran das liegen kann? Muss dafür ein bestimmtes Modul installiert sein?
Nein, aber Perl 5.8.x, Du scheinst noch 5.6 auf dem Server laufen zu haben, dieses hat
noch keine Unicode Unterstützung (IMHO).
Lies mal:
perldoc perluniintro
perldoc perlunicode
Bei perluniintro stehen unten "UNICODE IN OLDER PERLS", vielleicht hilft Dir dies weiter?
Viele Grüsse
Philipp
Hi!
Wer einfach nur mal schnell UTF-8 in Latin-1 konvertieren moechte, ohne die neueste Perl-Version oder diverse Module installieren zu muessen, findet folgenden Code vielleicht hilfreich. Voraussetzung fuer das korrekte Funktionieren ist, dass es sich beim Input wirklich um einen UTF-8-String handelt, der vollstaendig in Latin-1 darstellbar ist.
sub utf8_to_latin1($) {
my ($i, @s);
@s = unpack('C*', $_[0]);
for ($i=0; $i<@s; $i++) {
splice(@s, $i, 2, (($s[$i] & 0x03) << 6) | ($s[$i+1] & 0x3F))
if (($s[$i] & 0xFC) == 0xC0);
}
return pack('C*', @s);
}
Das ganze zum Nachvollziehen noch mal in ausfuehrlich:
sub utf8_to_latin1($) {
my ($i, @s);
@s = unpack('C*', $_[0]);
$i = 0;
while ($i < @s) {
if ($s[$i] & 0x80) {
# is a UTF-8 code
if (($s[$i] & 0xFC) == 0xC0) {
# this will render a valid Latin1 char
$s[$i] = (($s[$i] & 0x03) << 6) | ($s[$i+1] & 0x3F);
splice(@s, $i+1, 1);
$i++;
} else {
# any other unicode char
# we could determine the number of bytes of this code and skip them, but as the following
# values all have bit 7 set and bit 6 unset in a valid utf8 stream, we can just skip over
# this byte and the following will be automatically skipped as well. ok, we've seen more
# performant approaches, but this case is not expected to happen at all. after all, the
# string should be encodable in iso-8859-1
$i++;
}
} else {
# ASCII - leave unchanged
$i++;
}
}
return pack('C*', @s);
}
HTH && So long
Halihallo
Nein, aber Perl 5.8.x, Du scheinst noch 5.6 auf dem Server laufen zu haben, dieses hat
noch keine Unicode Unterstützung (IMHO).
Ich glaube ich irrte?
<cite>
The use of the Unicode::String module is deprecated in Perl 5.6, as there is a simpler way to perform the same operation:
$string =~ tr/\0-\xff//UC;
</cite>
heisst für mich, dass es >5.6 funktionieren sollte... Hast du auf dem Server eine
Perl-Version < 5.6 installiert?
Ich habe das Dokument erst jetzt gelesen, sorry. Aber Calocybe weiss ja Rat, wenn's mit
UC nicht funktioniert :-)
Viele Grüsse
Philipp