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>