[Python-de] utf8

Stefan Schwarzer sschwarzer at sschwarzer.net
Di Dez 30 13:23:24 CET 2014


On 2014-12-30 12:05, Hermann Riemann wrote:
> Stefan Schwarzer schrieb:
>> On 2014-12-28 09:32, Hermann Riemann wrote:
>>   # coding: utf-8
>>
>> reicht übrigens auch, siehe
>> https://www.python.org/dev/peps/pep-0263/ .
> 
> Und da steht etwas von Abhängigkeit vom Editor.
> Da ich aber mehrere Editoren verwende
> (meist emacs, manchmal vi, xemacs
>   und vielleicht auch mal andere)
> mag ich mich da nicht festlegen.

Wie geht "nicht festlegen"? Verwendest du in jeder Datei ein
anderes Format? ;-) Ok, das war jetzt spitzfindig. :-)

>> In Python 2 ist ASCII das Standard-Encoding für
>> Quelltext-Dateien, in Python 3 ist es UTF-8.
> 
> In strings gingen vielleicht auch ISO-Zeichen (>127).

Ich denke nicht. Vielleicht missverstehen wir uns hier.
Kannst du bitte genauer beschreiben, was du meinst?

>> [Encoding von Daten während der Laufzeit]
>>> import codecs
>>> ..
>>> f=codecs.open(dateiname,'r',"utf8")
>>> ..
>>
>> Ich würde die Funktion `open` aus dem `io`-Modul nehmen:
>>
>>   import io
>>
>>   fobj = io.open(dateiname, "r", encoding="utf8")
>     fobj  =codecs.open(dateiname, "r", "utf8")
> ist kürzer

Ja, aber ich denke, das ist nicht das einzige Argument, das
für eine der beiden Varianten spricht. Ich denke, dass
`io.open` in modernem Python die idiomatischere Variante
ist.

> Die Datei mit dem Inhalt:
> import locale
> print(locale.getpreferredencoding())
> liefert nach Aufruf mit Phyton3
> UTF-8

Das Problem ist, dass der Aufruf von `getpreferredencoding`
auf verschiedenen Betriebssystemen unterschiedliche Werte
liefern kann. Außerdem garantiert dieser Default-Wert nicht,
dass die Dateien, die du lesen willst, tatsächlich dieses
Encoding haben.

> Wenn also
>  The default encoding is platform dependent (whatever 
> locale.getpreferredencoding() returns) gilt
> müsste encoding default UTF-8 sein
> und nicht None wie bei der gelb markierten Parameterliste

Technisch ist der Default in der Argument-Liste `None`, aber
innerhalb von `open` wird der Rückgabewert von
`getpreferredencoding` verwendet, wenn das
`encoding`-Argument `None` ist. Daher sagt man in dem
Zusammenhang (etwas unpräzise), dass der Default-Wert der
Rückgabewert von `getpreferredencoding` ist.

>> `io.open` ist identisch mit der eingebauten `open`-Funktion
>> in Python 3.
> 
> D.h. ich könnte normale open 
> ohne Parameter für encoding
> für utf8-Dateien in Python>=3 benutzen.

Du könntest, aber ich rate davon ab. :-) Ich hatte in meiner
vorherigen Mail ja einiges dazu geschrieben.

> Mit open ging mal bei utf-8 etwas schief,
> was mich zur Suche nach Alternativen veranlasste.

Mir scheint, es gibt da noch ein paar Missverständnisse zu
Encodings und Byte-/Unicode-Strings. Falls du das noch nicht
getan hast, empfehle ich dir,
https://docs.python.org/3/howto/unicode.html zu lesen.

> Zu einigen Parameter habe ich noch fragen.
> ( Früher habe ich Dateien meist mit C bearbeitet.)
> 
> buffering:
> Wird bei buffering=0 der Wert sofort herausgeschrieben,

Laut
https://docs.python.org/3/library/functions.html#open
ist `buffering` == 0 nur für im Binärmodus geöffnete Dateien
zulässig.

> so dass bei Programmabbruch man das bis dahin geschriebene lesen kann?
> Als Ersatz für flush()

Theoretisch ja, aber ich würde mich nicht (hundertprozentig)
darauf verlassen. Das gilt für `flush` aber auch. Das
Problem ist, dass es Pufferung auf verschiedenen
Verarbeitungsebenen gibt und dass alle diese Ebenen die
`flush`-Semantik unterstützen müssen, also die gepufferten
Daten an die jeweilige Ebene "darunter" weiterreichen müssen.

> newline:
> Das Programm
> f=open('x','w')
> f.write("bla\nbla")
> f.close()
> f=open('x')
> for line in f:print(len(line))
> liefert:
> 4
> 3
> passt vielleicht nicht zur Beschreibung

Ich verstehe nicht, was du meinst. Auf welche "Beschreibung"
beziehst du dich hier?

>>> Hermann
>>>    der in jeder von ihm verwendete Programmiersprache
>>>    utf-8 Problem hatte oder hat.
>>
>> Welche Art von Problem(en)?
> 
> Z.B. QT4 utf im Menutext aus unterschiedlichen Quellen

Ich kenne mich mit Qt nicht aus, aber ich könnte mir
vorstellen, dass beim Lesen des oben angegebenen
Unicode-Howtos ein paar Dinge klarer werden.

Viele Grüße
Stefan


Mehr Informationen über die Mailingliste python-de