[Python-de] Was sein sollte

Martin v. Loewis martin at v.loewis.de
Fre Jan 2 11:51:00 CET 2004


kgm wrote:

> So ein Kodestück:
> 
> for tl in open("test.txt").readlines():
>     print tl
> 
> wird auch mit der jetzigen Py-Version nur dann wie gewünscht 
> funktionieren, wenn der Anwender "sinnvoll" mitspielt, er also in 
> test.txt das für sein System "passende" Encoding verwendet.

Allerdings weißt Du nicht, welches Encoding in diesem Stück
verwendet wird - und es ist dem Programm auch egal. Wenn Du
also festlegst, welches Encoding das sein muss, schränkst Du
Dein Programm ein.

> Wenn der User aber versucht, eine Datei von irgendeiner anderen Umgebung 
> mit einem exotischen Koding (auch bei Zeichen < 128) ausgeben will, dann 
> kommt Zeichenmüll raus, da kann Py noch soviel "aber USASCII ist doch 
> mein Standard" rufen ;-)

Genau. Deshalb sollte man sich *nie* auf das default encoding verlassen,
sondern *immer* selbst im Programm die Kodierungen angeben, soweit man
sie weiß; in den anderen Fällen sollte man versuchen, Bytes nicht als
Zeichen zu interpretieren.

> Punkt 2 müsstest Du es noch etwas genauer erklären (Beispiel?), ich 
> kenne Py-Interna nicht.

d = {'nice':1}
print d[u"nice"]

muss funktionieren; in Erweiterung auch

d = {'schön':1}
print d[u"schön"]

> Wo wären da zur jetzigen Lösung neue Probleme?

Gegenwärtig ist garantiert, dass der Hashwert von Unicode-Strings
der gleiche ist wie der Hashwert von Bytestrings, sofern in
beiden Fällen Werte < 128 verwendet werden. Wenn man aber
beispielsweise iso-8859-15 zum Default encoding macht, müsste
u"\u20ac" und "\xa4" den gleichen Hashwert liefert - ist das
Encoding hingegen iso-8859-1, müssten u"\u00x4" und "\x4"
den gleichen Hashwert liefern. Gleichzeitig sollten
u"\u20ac" und u"\u00a4" verschiedene Hashwerte haben.

Nenne einen Hashalgorithmus, der als Parameter das encoding
hat und diese Forderungen erfüllt! (natürlich auch die
normalen Forderungen an eine Hashfunktion: das identisch
selbe Objekt liefert immer den gleichen Hashwert usw.)

> Wie legt Py die u-Strings intern eigentlich ab? 2 Byte, glaube ich. 

Das ist eine Konfigurationsoption: 2 oder 4 Byte (--enable-ucs)

> Werden auch noch andere Infos ("Metadaten") abgelegt, zB, mit welchem 
> Koding der String erstellt wurde?

Der Hashwert wird gecached, sowie der Bytestring, der sich nach
Anwendung des default encoding ergibt (falls der Unicodestring in
einen Bytestring umgewandelt wurde). Deshalb darf man das default
encoding auch nicht nachträglich ändern: die gecacheten Strings
wären alle ungültig.

Frohes Neues Jahr,
Martin