[python] Nastavení default kódování print-u (je?t? jednou)

Petr Přikryl prikryl na atlas.cz
Úterý Duben 19 16:59:51 CEST 2011


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 na py.cz
 http://www.py.cz/mailman/listinfo/python
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20110419/78fb1501/attachment.html>


Další informace o konferenci Python