[Vienna-pm] Re: unicode

Peter J. Holzer hjp at wsr.ac.at
Thu Sep 30 03:45:56 CDT 2004


On 2004-09-29 23:29:17 +0200, peter pilsl wrote:
> Peter J. Holzer wrote:
> > 
> >Das Flag ist weder "gut" noch "schlecht", es dient dazu, zwei
> >Datentypen zu unterscheiden. Wenn es gesetzt ist, repräsentiert die
> >Bytefolge C3 A4 ein "ä", wenn es nicht gesetzt ist, repräsentiert sie
> >die zwei Zeichen mit den Codes C3 und A4 im lokalen Zeichensatz (in
> >Latin-1 LATIN CAPITAL LETTER A WITH TILDE und CURRENCY SIGN). 
> >
> 
> Vielen 1000 Dank.
> 
> ... und der character E4 ist dann eine "zusammenfassung" der folge C3 A4 
> bei gesetztem utf8-flag ?!  (E4=ä in der unicode-table)

Ja. Die Kodierung ist in perlunicode (unter "Unicode Encodings", wie
einfallsreich) beschrieben.

> Ich hab mir dein script im anderen posting angesehen (danke !!). Dein 
> Beispiel sortiert bei mir auch richtig. Aber generell sortiert es bei 
> mir falsch. Probier mal  ä ö ü a b.  Das ergibt bei mir a ö ä ü b !! 

Bei mir nicht.

> Und das ist falsch.

Siehe unten.

> upgrade u encode tut hier übrigens nicht das gleiche, obwohl ich das 
> eigentlich erwartet habe. upgrade ist ein nop, die nur das utf8-flag 
> setzt.

Nein, es ist kein nop. Tatsächlich wird hier jedes Byte in eine
utf-8-Folge umgewandelt. Im Normalfall merkst Du aber nichts davon, weil
perl weiß, dass das ein UTF-8-String ist und ihn entsprechend behandelt.

utf8::upgrade($s) ist äquivalent zu Encoding::decode("iso-8859-1", $s)

> encode setzt auch das utf8-flag, aber fasst eben auch c3a4 zu dem 
> character e4 zusammen.
> Obwohl das intern sicher immer noch ein c3a4 ist,

So ist es.

> aber wie wird das dann 
> unterschiedlich interpretiert?

Im ersten Fall ist das intern eben nicht mehr c3 a4, sondern 
c3 83 c2 a4 (also die UTF-Kodierung von \u00C3 \u00A4.


> Das script:
> zu jedem string werden über die methode ustat auch ein hexdump und die 
> utf8-flags ausgegeben.
> 
> --------------------------------------
> #!/usr/local/bin/perl -w
> use strict;
> 
> use POSIX qw(locale_h);
> use locale;
> setlocale(LC_COLLATE, "de_AT");
                         ^^^^^
			 de_AT ist mit hoher Wahrscheinlichkeit falsch.
Das ist wahrscheinlich eine Locale mit iso-8859-15, nicht mit UTF-8. 
Probier mal de_AT.utf8. Bei mir sortiert er dann richtig. (und wenn ich
binmode STDOUT, ":utf8" setze, schaut der Output auf einem
UTF-8-Terminal auch richtig aus).

> ps: ein string der art 61 c3 a4 62 mit ungesetztem utf8-flag ist auch 
> exakt das, was das CGI-Modul an parametern liefert.

Den musst Du dann noch dekodieren. Wäre natürlich schön, wenn das
CGI-Modul das selbst könnte, scheint aber laut man-Page nicht so zu
sein.

	hp

-- 
   _  | Peter J. Holzer      | Shooting the users in the foot is bad. 
|_|_) | Sysadmin WSR / LUGA  | Giving them a gun isn't.
| |   | hjp at wsr.ac.at        |	-- Gordon Schumacher,
__/   | http://www.hjp.at/   |     mozilla bug #84128
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 384 bytes
Desc: not available
Url : http://mail.pm.org/archives/vienna-pm/attachments/20040930/b4ddd2ba/attachment.bin


More information about the Vienna-pm mailing list