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.