hotti: Umlaute und

Beitrag lesen

hi,

Demnach werden Umlaute wohl nicht unterstützt?

Seit Perl v5.6 unterscheidet Perl zwischen Oktetten und Zeichenketten. Für UTF-8-Zeichenketten gibt es den internen ScalarValue UTF-8, kurz: SvUTF8.

Das Verhalten der String-Funktionen ist abhängig davon, ob Oktetten oder Zeichenketten übergeben werden, z.B.:

  
use utf8;  
print length 'ä'; # 1, also 1 Zeichen  
  
no utf8;  
print length 'ä'; # 2, also 2 Oktetten  

Ähnlich ists mit anderen Stringfunktionen uc(), ucfirst() usw.

ucfirst('ä') liefert nur dann, ein 'Ä', wenn
1. das Script in utf-8 gespeichert wurde
2. use utf8; eingebunden wurde

use utf8 wirkt jedoch nur auf die im Script selbst notierten Literale, in og. Bsp. 'ä'

Hast Du UTF-8 in einer Variable $s, funktioniert uc($s) nur dann, wenn in $s keine Oktetten sind sondern eine UTF-8-kodierte Zeichenkette als SvUTF8. Mit Modul Encode (seit v5.8 verfügbar) kannst Du zwischen Oktetten und Zeichenketten vermitteln.

Grundregel auch: Alles was IO ist, muss als Oktetten vorliegen. Wenn Du einen SvUTF8 mit print auf STDOUT gibts (CGI -> Webserver) kommt ggf. eine Fehlermeldung, auf jeden Fall sind die Umlaute verstümmelt. Vor dem print also den SvUTF8 wieder als Oktetten deklarieren oder dem IO-Layer mitteilen, dass UTF-8 kommt.

Das Thema ist ein bischen komplex, hierzu musst Du noch Einiges an Eigenleistung erbringen ;)

Verwandt damit ist 'use bytes; no bytes;' umschalten zwischen Character- oder Bytesemantic.

In oder aus Richtung mysql ist der SvUTF8 voll kompatibel, so kann Perl mit mysql vollständig zeichenorientiert kommunizieren.

Hotti