Ať se na to díváš jak chceš, vždycky někde nastane nějaká <br />
komplikace. Problém je v tom, že string v Pythonu 2.x je posloupnost<br />
bajtů a informace o kódování u toho není zachycena.<br />
<br />
Nakonec jsem dospěl k tomu, že je nutné používat unicode řetězce<br />
(i v Pythonu 2). Zatím to může být v reálném provozu utopie, ale <br />
je dobré se pomalu přeorientovávat na Python 3.<br />
<br />
Petr<br />
<br />
______________________________________________________________<br />
> zu1234 napsal<br />
><br />
Děkuji za krásné uvedení do problému!!<br />
<br />
K obsluze kódování na výstupu z programů<br />
jsem začal používat codecs.getwriter(...)<br />
jak mi zde bylo poraděno.<br />
<br />
Pod windows mi to například umožňuje nastavit<br />
stdout (který jde do souboru) na cp1250<br />
a strerr (který jde na terminál) na cp852.<br />
<br />
Je to dobré řešení až na jeden problém:<br />
Pokud nastavím kódování i na stderr a nastane<br />
chyba při běhu programu na řádku obsahujícím<br />
české znaky, nezobrazí se popis chyby.<br />
To trochu komplikuje ladění programu.<br />
<br />
Nevím jak to odstranit.<br />
<br />
Například:<br />
<br />
-----------<br />
Varianta s sys.stderr = codecs.getwriter ....<br />
#!/usr/bin/python<br />
# -*- coding: utf-8 -*-<br />
<br />
import sys<br />
import codecs<br />
<br />
sys.stderr = codecs.getwriter('cp852')(sys.stderr)<br />
<br />
print "ššš %s" % ()<br />
<br />
-----------<br />
Chybové hlášení částečné:<br />
Traceback (most recent call last):<br />
File "x.py", line 10, in <module><br />
<br />
------------<br />
Varianta bez sys.stderr = codecs.getwriter ....<br />
#!/usr/bin/python<br />
# -*- coding: utf-8 -*-<br />
<br />
import sys<br />
import codecs<br />
<br />
# sys.stderr = codecs.getwriter('cp852')(sys.stderr)<br />
<br />
print "ššš %s" % ()<br />
<br />
<br />
-----------<br />
Chybové hlášení úplné:<br />
Traceback (most recent call last):<br />
File "x.py", line 9, in <module><br />
print "ššš %s" % ()<br />
TypeError: not enough arguments for format string<br />
<br />
<br />
<br />
Dne 19.4.2011 12:30, Filip Štědronský napsal(a):<br />
> Dne 22.3.2011 14:38:22 napsal zu1234:<br />
>> Ale mohl by mi někdo vysvětlit proč to nejde bez reload?<br />
>><br />
>> #!/usr/bin/python<br />
>> # -*- coding: utf-8 -*-<br />
>><br />
>> import sys<br />
>> reload(sys)<br />
>><br />
>> if sys.stdout.isatty():<br />
>> # Výstup jde na terminál:<br />
>> sys.setdefaultencoding('cp852')<br />
>> else:<br />
>> # Výstup jde do souboru:<br />
>> sys.setdefaultencoding('cp1250')<br />
>><br />
>> print u'šílené'<br />
><br />
> Ahoj,<br />
> tohle všechno je způsobeno tím, že funkce setdefaultencoding<br />
> není tak úplně určena pro uživatele. Při startu Pythonu se<br />
> automaticky importuje modul site.py, který se stará o všechny<br />
> možné druhy nastavení a inicializací a který je podle potřeby<br />
> možné přizpůsobit podle potřeb cílové platformy a/nebo<br />
> administrátora. Tam se mimo jiné volá funkce setdefaultencoding<br />
> s nějakou hodnotou, kterou to považuje za "rozumnou" pro dané<br />
> prostředí (v linuxu se to snaží uhodnout podle locale, na oknech<br />
> to nejspíš bude vždy ascii). A poté, co to udělá, prostě funkci<br />
> setdefaultencoding z modulu sys smaže (aby si s ní nehráli<br />
> programátoři --- neboť v dobré víře je nastavení kódování<br />
> považováno za věc prostředí, do které Pythoní program, kterýžto<br />
> by měl být na prostředí nezávislý, nemá co mluvit). Reloadem<br />
> se sys vrátí do původního stavu, tedy včetně metody, kterou<br />
> původně site smazal. Pro podrobnější informace doporučuji projít<br />
> site.py někde v knihovních adresářích pythonu.<br />
><br />
> Snad to dává aspoň trochu smysl<br />
> Filip Štědronský<br />
><br />
><br />
_______________________________________________<br />
Python mailing list<br />
Python@py.cz<br />
<a href="http://www.py.cz/mailman/listinfo/python">http://www.py.cz/mailman/listinfo/python</a>