encoding, cp850

encoding, cp850

am 09.01.2008 21:00:24 von Stefan Seth

Hallo,

ich hab ein Problem mit dem Verständnis der Kodierung von
Zeichenketten. Z. B. möchte ich von der Windows-Kommandozeile aus ins
Verzeichnis c:\täst wechseln:

$eins = "ä";
printf "%x %s\n", ord($eins), $eins;
chdir "c:/t" . $eins . "st" or print "1 geht nicht\n";

binmode(STDIN, ":encoding(cp850)");
$zwei = ;
chomp $zwei;
printf "%x %s\n", ord($zwei), $zwei;
chdir "c:/t" . $zwei . "st" or print "2 geht nicht\n";

print "gleich\n" if $eins eq $zwei;
__END__
e4 õ
ä
e4 õ
2 geht nicht
gleich


Was ist denn der Unterschied zwischen $eins und $zwei, so daß die
zweite Variante nicht funktioniert? Wieso gibt der Vergleich mit 'eq'
wahr? Und wie geht's richtig?

Gruß
Stefan
--
Oben sei ein Kopf.

Re: encoding, cp850

am 09.01.2008 23:27:55 von Slaven Rezic

Stefan Seth writes:

> Hallo,
>
> ich hab ein Problem mit dem Verständnis der Kodierung von
> Zeichenketten. Z. B. möchte ich von der Windows-Kommandozeile aus ins
> Verzeichnis c:\täst wechseln:
>
> $eins = "ä";
> printf "%x %s\n", ord($eins), $eins;
> chdir "c:/t" . $eins . "st" or print "1 geht nicht\n";
>
> binmode(STDIN, ":encoding(cp850)");
> $zwei = ;
> chomp $zwei;
> printf "%x %s\n", ord($zwei), $zwei;
> chdir "c:/t" . $zwei . "st" or print "2 geht nicht\n";
>
> print "gleich\n" if $eins eq $zwei;
> __END__
> e4 õ
> ä
> e4 õ
> 2 geht nicht
> gleich
>
>
> Was ist denn der Unterschied zwischen $eins und $zwei, so daß die
> zweite Variante nicht funktioniert? Wieso gibt der Vergleich mit 'eq'
> wahr? Und wie geht's richtig?

Leider funktioniert Unicode und alles, was mit Dateinamen zu tun hat,
unter Perl (bis einschließlich Version 5.10.0) nicht so, wie das
restliche Unicode-System. Am Besten ist es wohl, wenn man hier so viel
wie möglich mit Bytes arbeitet. Eine Behebung des jetzigen Zustands
ist nicht vor 5.12 zu erwarten.

Gruß,
Slaven

--
Slaven Rezic - slaven rezic de

Tk-AppMaster: a perl/Tk module launcher designed for handhelds
http://tk-appmaster.sf.net

Re: encoding, cp850

am 09.01.2008 23:47:04 von Moritz Lenz

Hallo,

Slaven Rezic wrote:
> Stefan Seth writes:
>=20
>> Hallo,
>>=20
>> ich hab ein Problem mit dem Verständnis der Kodierung von
>> Zeichenketten. Z. B. möchte ich von der Windows-Kommandozeile aus in=
s
>> Verzeichnis c:\täst wechseln:
>>=20
>> $eins =3D "ä";
>> printf "%x %s\n", ord($eins), $eins;
>> chdir "c:/t" . $eins . "st" or print "1 geht nicht\n";
>>=20
>> binmode(STDIN, ":encoding(cp850)");
>> $zwei =3D ;
>> chomp $zwei;
>> printf "%x %s\n", ord($zwei), $zwei;
>> chdir "c:/t" . $zwei . "st" or print "2 geht nicht\n";
>>=20
>> print "gleich\n" if $eins eq $zwei;
>> __END__
>> e4 =F5
>> ä
>> e4 =F5
>> 2 geht nicht
>> gleich
>>=20
>>=20
>> Was ist denn der Unterschied zwischen $eins und $zwei, so daß die
>> zweite Variante nicht funktioniert? Wieso gibt der Vergleich mit 'eq'
>> wahr? Und wie geht's richtig?

Richtig geht es, glaube ich, mit Win32.pm, oder einem anderen
CPAN-Modul, das direkt auf die Windows-Api zugreift und konsistent
UTF-16 benutzt. Ich weiß leider nicht mehr genau, welches Modul das
macht, und habe kein Windows zum testen da. Ich weiß aber, dass das
ganze (mehrfach) aud perlmonks.org diskutiert wurde und da auch eine
akzeptable Lösung angeboten wurde.

> Leider funktioniert Unicode und alles, was mit Dateinamen zu tun hat,
> unter Perl (bis einschließlich Version 5.10.0) nicht so, wie das
> restliche Unicode-System.=20

Ja, leider.

HTH,
Moritz

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

Re: encoding, cp850

am 10.01.2008 11:33:38 von struebig

Stefan Seth schrieb:
> Hallo,
>
> ich hab ein Problem mit dem Verständnis der Kodierung von
> Zeichenketten. Z. B. möchte ich von der Windows-Kommandozeile aus ins
> Verzeichnis c:\täst wechseln:

Bei mir funktioniert:

use Encode;
my $dir = 'täst';
$dir = encode('iso-8859-1', $dir);

chdir $dir or warn $!;

Re: encoding, cp850

am 10.01.2008 19:50:14 von Stefan Seth

Moritz Lenz schrieb:

> Slaven Rezic wrote:
>> Stefan Seth writes:
>>
>>> ich hab ein Problem mit dem Verständnis der Kodierung von
>>> Zeichenketten. Z. B. möchte ich von der Windows-Kommandozeile
>>> aus ins Verzeichnis c:\täst wechseln:
>>>
>>> $eins = "ä";
>>> printf "%x %s\n", ord($eins), $eins;
>>> chdir "c:/t" . $eins . "st" or print "1 geht nicht\n";
>>>
>>> binmode(STDIN, ":encoding(cp850)");
>>> $zwei = ;
>>> chomp $zwei;
>>> printf "%x %s\n", ord($zwei), $zwei;
>>> chdir "c:/t" . $zwei . "st" or print "2 geht nicht\n";
>>>
>>> print "gleich\n" if $eins eq $zwei;
>>> __END__
>>> e4 õ
>>> ä
>>> e4 õ
>>> 2 geht nicht
>>> gleich
>>>
>>>
>>> Was ist denn der Unterschied zwischen $eins und $zwei, so daß
>>> die zweite Variante nicht funktioniert? Wieso gibt der Vergleich
>>> mit 'eq' wahr? Und wie geht's richtig?
>
> Richtig geht es, glaube ich, mit Win32.pm, oder einem anderen
> CPAN-Modul, das direkt auf die Windows-Api zugreift und konsistent
> UTF-16 benutzt. Ich weiß leider nicht mehr genau, welches Modul
> das macht, und habe kein Windows zum testen da. Ich weiß aber,
> dass das ganze (mehrfach) aud perlmonks.org diskutiert wurde und
> da auch eine akzeptable Lösung angeboten wurde.

Eine möglich Lösung habe ich jetzt selbst gefunden, siehe paralleles
Posting. Jetzt wüßte ich nur noch gern, warum (und bis zu welcher Perl-
Version) die funktioniert. ;-)

Gruß
Stefan
--
Melke: Hu is president.

Re: encoding, cp850

am 10.01.2008 19:50:14 von Stefan Seth

J. Strübig schrieb:

> Stefan Seth schrieb:
>> Hallo,
>>
>> ich hab ein Problem mit dem Verständnis der Kodierung von
>> Zeichenketten. Z. B. möchte ich von der Windows-Kommandozeile aus
>> ins Verzeichnis c:\täst wechseln:
>
> Bei mir funktioniert:
>
> use Encode;
> my $dir = 'täst';
> $dir = encode('iso-8859-1', $dir);
>
> chdir $dir or warn $!;

Das geht (bei mir) ganz einfach:
my $dir = 'c:/täst';
chdir $dir or warn $!;
__END__
keine Warnung


Auch das Übergeben des Verzeichnisnamens als Parameter auf der
Kommandozeile funktioniert ohne Encode:
my $dir = shift;
chdir $dir or warn $!;
__END__
keine Warnung


Das klappt nicht, wenn ich das Verzeichnis von hole:
$dir = ;
chomp $dir;
chdir $dir or warn $!;
__END__
c:/täst
No such file or directory at stdin.pl line 3, line 1.


Nach einigem trial and error diese Lösung:
use Encode qw/from_to/;
$dir = ;
chomp $dir;
from_to( $dir, "cp850", "iso-8859-1" );
chdir $dir or warn $!;
__END__
keine Warnung


Versucht hatte ich vorher das:
binmode(STDIN, ":encoding(cp850)");
$dir = ;
chomp $dir;
chdir $dir or warn $!;
__END__
c:/täst
No such file or directory at binmode.pl line 4, line 1.


Das kann man folgendermaßen zum Laufen bringen. Wäre nett, wenn mir
jemand erklären würde, was dort passiert.

use Encode qw/from_to encode/;
binmode(STDIN, ":encoding(cp850)");
$dir = ;
chomp $dir;
$irgendein_alias = "utf-32";
$dir = encode( $irgendein_alias, $dir );
from_to( $dir, $irgendein_alias, "iso-8859-1" );
chdir $dir or warn $!;
__END__
keine Warnung

Gruß
Stefan
--
Melke: Hu is president.

Re: encoding, cp850

am 10.01.2008 20:59:00 von helmut

Hallo, Stefan,

Du (stseth) meintest am 10.01.08:

>> use Encode;
>> my $dir = 'täst';
>> $dir = encode('iso-8859-1', $dir);

[...]

> Nach einigem trial and error diese Lösung:
> use Encode qw/from_to/;
> $dir = ;
> chomp $dir;
> from_to( $dir, "cp850", "iso-8859-1" );
> chdir $dir or warn $!;
> __END__
> keine Warnung


Und Du sitzt demnach an einem Rechner, der die Tastatur-Eingabe gemäss
cp850 umsetzt - das ist nicht überall so.

Viele Gruesse!
Helmut

Re: encoding, cp850

am 11.01.2008 20:08:21 von Stefan Seth

Stefan Seth schrieb:

> $irgendein_alias = "utf-32";
> $dir = encode( $irgendein_alias, $dir );
> from_to( $dir, $irgendein_alias, "iso-8859-1" );

Weniger umständlich:

$dir = encode( "iso-8859-1", $dir );

Gruß
Stefan
--
Oben sei ein Kopf.

Re: encoding, cp850

am 11.01.2008 20:08:21 von Stefan Seth

Helmut Hullen schrieb:

>> Nach einigem trial and error diese Lösung:
>> use Encode qw/from_to/;
>> $dir = ;
>> chomp $dir;
>> from_to( $dir, "cp850", "iso-8859-1" );
>> chdir $dir or warn $!;
>> __END__
>> keine Warnung
>
>
> Und Du sitzt demnach an einem Rechner, der die Tastatur-Eingabe
> gemäss cp850 umsetzt - das ist nicht überall so.

Habe ich das behauptet?

Herauszufinden, welchen Zeichensatz die Konsole benutzt, finde ich
nicht so schwierig. Sich zwischen encode/decode/from_to zu entscheiden,
das ist die Herausforderung. ;-) In diesem Beispiel muß man doch
wissen, daß octets (in cp850) liefert und daß chdir octets (in
iso-8859-1) "akzeptiert".

Gruß
Stefan
--
Oben sei ein Kopf.