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 _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de