Behandlung UTF-8 Zeichen Linux/Solaris

Behandlung UTF-8 Zeichen Linux/Solaris

am 14.01.2008 14:14:50 von Christoph Krempe

Hallo,

ich bin über folgendes Problem gestolpert, für das ich keine Lösung
gefunden habe. Mein Programm ließt eine UTF-8-Datei ein und behandelt
den Inhalt zeichenweise:

use strict;
binmode(STDOUT, ":utf8");
use open ':utf8';

open ALG, "<", "eingabe";
while(){
my $zeichen;
my @satz = split(//,$_);
foreach $zeichen (@satz) {
print $zeichen;
}
close(ALG);

Unter Linux (32bit) funktioniert das, unter Solaris (64bit) werden UTF-8-
Zeichen der Eingabedatei byteweise, nicht wie in perl vorgesehen
zeichenweise durch das "split" verarbeitet.

perl -v unter Solaris zeigt:
This is perl, v5.8.7 built for sun4-solaris

Weiß jemand warum?

Christoph

Re: Behandlung UTF-8 Zeichen Linux/Solaris

am 14.01.2008 14:22:48 von Moritz Lenz

Hallo,

Christoph Krempe wrote:
> Hallo,
>=20
> ich bin über folgendes Problem gestolpert, für das ich keine =
Lösung=20
> gefunden habe. Mein Programm ließt eine UTF-8-Datei ein und behand=
elt=20
> den Inhalt zeichenweise:
>=20
> use strict;
> binmode(STDOUT, ":utf8");
> use open ':utf8';
>=20
> open ALG, "<", "eingabe";
> while(){

use Devel::Peek; # an den Anfang
Dump($_);
Und schick uns mal die Ausgabe davon

> my $zeichen;
> my @satz =3D split(//,$_);
> foreach $zeichen (@satz) {
> print $zeichen;
> }
> close(ALG);
>=20
> Unter Linux (32bit) funktioniert das, unter Solaris (64bit) werden UTF-=
8-
> Zeichen der Eingabedatei byteweise, nicht wie in perl vorgesehen=20
> zeichenweise durch das "split" verarbeitet.
>=20
> perl -v unter Solaris zeigt:
> This is perl, v5.8.7 built for sun4-solaris
>=20
> Weiß jemand warum?

Meine (nicht begründete) Vermutung ist, dass es am use open ':utf8' =
liegt.
Geht es denn, wenn du direkt mit open ALG, '<:utf8', "eingabe";
arbeitest und das use open ':utf8'; weglässt?

Grüße,
Moritz


--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/

Re: Behandlung UTF-8 Zeichen Linux/Solaris

am 14.01.2008 14:24:50 von Frank Seitz

Christoph Krempe wrote:
>
> Unter Linux (32bit) funktioniert das, unter Solaris (64bit) werden UTF-8-
> Zeichen der Eingabedatei byteweise, nicht wie in perl vorgesehen
> zeichenweise durch das "split" verarbeitet.
>
> perl -v unter Solaris zeigt:
> This is perl, v5.8.7 built for sun4-solaris

Laut der Doku zum open-Pragma (perdoc open), scheint mir
das Verhalten unter Solaris richtig zu sein:

"Three-argument opens are not affected by this pragma since there you (can)
explicitly specify the layers and are supposed to know what you are doing."

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Behandlung UTF-8 Zeichen Linux/Solaris

am 14.01.2008 14:50:23 von Christoph Krempe

Am Mon, 14 Jan 2008 14:22:48 +0100 schrieb Moritz Lenz:

> Hallo,
>
> Christoph Krempe wrote:
>> Hallo,
>>
>> ich bin über folgendes Problem gestolpert, für das ich keine Lösung
>> gefunden habe. Mein Programm ließt eine UTF-8-Datei ein und behandelt
>> den Inhalt zeichenweise:
>>
>> use strict;
>> binmode(STDOUT, ":utf8");
>> use open ':utf8';
>>
>> open ALG, "<", "eingabe";
>> while(){
>
> use Devel::Peek; # an den Anfang
> Dump($_);
> Und schick uns mal die Ausgabe davon
>
>> my $zeichen;
>> my @satz = split(//,$_);
>> foreach $zeichen (@satz) {
>> print $zeichen;
>> }
>> close(ALG);
>>
>> Unter Linux (32bit) funktioniert das, unter Solaris (64bit) werden
>> UTF-8- Zeichen der Eingabedatei byteweise, nicht wie in perl vorgesehen
>> zeichenweise durch das "split" verarbeitet.
>>
>> perl -v unter Solaris zeigt:
>> This is perl, v5.8.7 built for sun4-solaris
>>
>> Weiß jemand warum?
>
> Meine (nicht begründete) Vermutung ist, dass es am use open ':utf8'
> liegt. Geht es denn, wenn du direkt mit open ALG, '<:utf8', "eingabe";
> arbeitest und das use open ':utf8'; weglässt?
>
> Grüße,
> Moritz

Das Ergebnis ist das gleiche.

Re: Behandlung UTF-8 Zeichen Linux/Solaris

am 14.01.2008 15:05:40 von Christoph Krempe

Am Mon, 14 Jan 2008 14:22:48 +0100 schrieb Moritz Lenz:

> Hallo,
>
> Christoph Krempe wrote:
>> Hallo,
>>
>> ich bin über folgendes Problem gestolpert, für das ich keine Lösung
>> gefunden habe. Mein Programm ließt eine UTF-8-Datei ein und behandelt
>> den Inhalt zeichenweise:
>>
>> use strict;
>> binmode(STDOUT, ":utf8");
>> use open ':utf8';
>>
>> open ALG, "<", "eingabe";
>> while(){
>
> use Devel::Peek; # an den Anfang
> Dump($_);
> Und schick uns mal die Ausgabe davon

SV = PV(0x70ae8) at 0x22994
REFCNT = 1
FLAGS = ()
PV = 0x9dc00 ""\0
CUR = 0
LEN = 9032

>
>> my $zeichen;
>> my @satz = split(//,$_);
>> foreach $zeichen (@satz) {
>> print $zeichen;
>> }
>> close(ALG);
>>
>> Unter Linux (32bit) funktioniert das, unter Solaris (64bit) werden
>> UTF-8- Zeichen der Eingabedatei byteweise, nicht wie in perl vorgesehen
>> zeichenweise durch das "split" verarbeitet.
>>
>> perl -v unter Solaris zeigt:
>> This is perl, v5.8.7 built for sun4-solaris
>>
>> Weiß jemand warum?
>
> Meine (nicht begründete) Vermutung ist, dass es am use open ':utf8'
> liegt. Geht es denn, wenn du direkt mit open ALG, '<:utf8', "eingabe";
> arbeitest und das use open ':utf8'; weglässt?
>
> Grüße,
> Moritz

Re: Behandlung UTF-8 Zeichen Linux/Solaris

am 14.01.2008 16:24:35 von Christoph Krempe

Am Mon, 14 Jan 2008 13:14:50 +0000 schrieb Christoph Krempe:

> Hallo,
>
> ich bin über folgendes Problem gestolpert, für das ich keine Lösung
> gefunden habe. Mein Programm ließt eine UTF-8-Datei ein und behandelt
> den Inhalt zeichenweise:
>
> use strict;
> binmode(STDOUT, ":utf8");
> use open ':utf8';
>
> open ALG, "<", "eingabe";
> while(){
> my $zeichen;
> my @satz = split(//,$_);
> foreach $zeichen (@satz) {
> print $zeichen;
> }
> close(ALG);
>
> Unter Linux (32bit) funktioniert das, unter Solaris (64bit) werden
> UTF-8- Zeichen der Eingabedatei byteweise, nicht wie in perl vorgesehen
> zeichenweise durch das "split" verarbeitet.
>
> perl -v unter Solaris zeigt:
> This is perl, v5.8.7 built for sun4-solaris
>
> Weiß jemand warum?
>
> Christoph

Das Problem liegt nicht am split, sondern an der Behandlung von $zeichen:
So wie oben ausgegeben ist das Ergebnis ok. Gebe ich aber ein zweites mal
aus, z.B. mit:

print $zeichen, $zeichen;

stimmt das Ergebnis nicht mehr: Aus "ö" macht das print "\303ö\266".
printf() macht das gleiche.

Christoph

Re: Behandlung UTF-8 Zeichen Linux/Solaris

am 14.01.2008 18:18:01 von Moritz Lenz

Christoph Krempe wrote:
> Am Mon, 14 Jan 2008 14:22:48 +0100 schrieb Moritz Lenz:
>=20
>> Hallo,
>>=20
>> Christoph Krempe wrote:
>>> Hallo,
>>>=20
>>> ich bin über folgendes Problem gestolpert, für das ich kein=
e Lösung
>>> gefunden habe. Mein Programm ließt eine UTF-8-Datei ein und beha=
ndelt
>>> den Inhalt zeichenweise:
>>>=20
>>> use strict;
>>> binmode(STDOUT, ":utf8");
>>> use open ':utf8';
>>>=20
>>> open ALG, "<", "eingabe";
>>> while(){
>>=20
>> use Devel::Peek; # an den Anfang
>> Dump($_);
>> Und schick uns mal die Ausgabe davon
>=20
> SV =3D PV(0x70ae8) at 0x22994
> REFCNT =3D 1
> FLAGS =3D ()
> PV =3D 0x9dc00 ""\0
> CUR =3D 0
> LEN =3D 9032

Der Dump von einem leeren String ist nicht besonders interessant, ich
bin mir sicher, dass leere Strings nicht zu kaputter Darstellung füh=
ren ;-)

Bist du dir sicher, dass dein Terminal utf8 kann und auch richtig
konfiguriert ist? zeigt ein einfaches cat eine UTF-8-Datei korrekt an?


--=20
Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/

Re: Behandlung UTF-8 Zeichen Linux/Solaris

am 15.01.2008 09:12:45 von Christoph Krempe

Am Mon, 14 Jan 2008 18:18:01 +0100 schrieb Moritz Lenz:

> Christoph Krempe wrote:
>> Am Mon, 14 Jan 2008 14:22:48 +0100 schrieb Moritz Lenz:
>>
>>> Hallo,
>>>
>>> Christoph Krempe wrote:
>>>> Hallo,
>>>>
>>>> ich bin über folgendes Problem gestolpert, für das ich keine Lösung
>>>> gefunden habe. Mein Programm ließt eine UTF-8-Datei ein und behandelt
>>>> den Inhalt zeichenweise:
>>>>
>>>> use strict;
>>>> binmode(STDOUT, ":utf8");
>>>> use open ':utf8';
>>>>
>>>> open ALG, "<", "eingabe";
>>>> while(){
>>>
>>> use Devel::Peek; # an den Anfang
>>> Dump($_);
>>> Und schick uns mal die Ausgabe davon
>>
>> SV = PV(0x70ae8) at 0x22994
>> REFCNT = 1
>> FLAGS = ()
>> PV = 0x9dc00 ""\0
>> CUR = 0
>> LEN = 9032
>
> Der Dump von einem leeren String ist nicht besonders interessant, ich
> bin mir sicher, dass leere Strings nicht zu kaputter Darstellung führen
> ;-)
>
> Bist du dir sicher, dass dein Terminal utf8 kann und auch richtig
> konfiguriert ist? zeigt ein einfaches cat eine UTF-8-Datei korrekt an?

Ja, da ist alles ok, ich war auf der falschen Fährte.

use open:utf8;

while(){
my $zeichen;
my @satz = split(//,$_);
foreach $zeichen (@satz) {
print $zeichen;
}

zeigt die einzelnen Zeichen wie erwartet an. Wenn ich aber wiederholt
$zeichen verwende, z.B. schon bei

print $zeichen, $zeichen;

oder

bei der Verwendung von $zeichen als hash-key in

print $t{$zeichen}

ist der Inhalt von $zeichen irgerndwie verstümmelt. Aus "ö" macht das
print z.B. "\303ö\266".