Ať se na to díváš jak chceš, vždycky někde nastane nějaká komplikace. Problém je v tom, že string v Pythonu 2.x je posloupnost
bajtů a informace o kódování u toho není zachycena.

Nakonec jsem dospěl k tomu, že je nutné používat unicode řetězce
(i v Pythonu 2). Zatím to může být v reálném provozu utopie, ale je dobré se pomalu přeorientovávat na Python 3.

Petr

______________________________________________________________
> zu1234 napsal
>
Děkuji za krásné uvedení do problému!!

K obsluze kódování na výstupu z programů
jsem začal používat codecs.getwriter(...)
jak mi zde bylo poraděno.

Pod windows mi to například umožňuje nastavit
stdout (který jde do souboru) na cp1250
a strerr (který jde na terminál) na cp852.

Je to dobré řešení až na jeden problém:
Pokud nastavím kódování i na stderr a nastane
chyba při běhu programu na řádku obsahujícím
české znaky, nezobrazí se popis chyby.
To trochu komplikuje ladění programu.

Nevím jak to odstranit.

Například:

-----------
Varianta s sys.stderr = codecs.getwriter ....
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import codecs

sys.stderr = codecs.getwriter('cp852')(sys.stderr)

print "ššš %s" % ()

-----------
Chybové hlášení částečné:
Traceback (most recent call last):
  File "x.py", line 10, in
------------
Varianta bez sys.stderr = codecs.getwriter ....
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import codecs

# sys.stderr = codecs.getwriter('cp852')(sys.stderr)

print "ššš %s" % ()


-----------
Chybové hlášení úplné:
Traceback (most recent call last):
  File "x.py", line 9, in     print "┼í┼í┼í %s" % ()
TypeError: not enough arguments for format string



Dne 19.4.2011 12:30, Filip Štědronský napsal(a):
> Dne 22.3.2011 14:38:22 napsal zu1234:
>> Ale mohl by mi někdo vysvětlit proč to nejde bez reload?
>>
>> #!/usr/bin/python
>> # -*- coding: utf-8 -*-
>>
>> import sys
>> reload(sys)
>>
>> if sys.stdout.isatty():
>>       # Výstup jde na terminál:
>>       sys.setdefaultencoding('cp852')
>> else:
>>       # Výstup jde do souboru:
>>      sys.setdefaultencoding('cp1250')
>>
>> print u'šílené'
>
> Ahoj,
> tohle všechno je způsobeno tím, že funkce setdefaultencoding
> není tak úplně určena pro uživatele. Při startu Pythonu se
> automaticky importuje modul site.py, který se stará o všechny
> možné druhy nastavení a inicializací a který je podle potřeby
> možné přizpůsobit podle potřeb cílové platformy a/nebo
> administrátora. Tam se mimo jiné volá funkce setdefaultencoding
> s nějakou hodnotou, kterou to považuje za "rozumnou" pro dané
> prostředí (v linuxu se to snaží uhodnout podle locale, na oknech
> to nejspíš bude vždy ascii). A poté, co to udělá, prostě funkci
> setdefaultencoding z modulu sys smaže (aby si s ní nehráli
> programátoři --- neboť v dobré víře je nastavení kódování
> považováno za věc prostředí, do které Pythoní program, kterýžto
> by měl být na prostředí nezávislý, nemá co mluvit). Reloadem
> se sys vrátí do původního stavu, tedy včetně metody, kterou
> původně site smazal. Pro podrobnější informace doporučuji projít
> site.py někde v knihovních adresářích pythonu.
>
> Snad to dává aspoň trochu smysl
> Filip Štědronský
>
>
_______________________________________________
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python
_______________________________________________
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

Odpovedet emailem