[python] python a cestina
Radek Kanovsky
rk na dat.cz
Čtvrtek Červenec 4 19:34:03 CEST 2002
On Thu, Jul 04, 2002 at 03:56:24PM +0200, servigo na seznam.cz wrote:
> jak je na tom python s cestinou?
> co se pouziva: unicode, kodove stranky?
> 1. umi wxPython standartne cestinu(unicode/utf/...) nebo je treba ho
> speci compilovat?
S wx moc zkusenosti nemam, takze nevim.
> 2. zkousel sem unicode jenom pomoci print a tohle je vysledek
>
> Traceback (most recent call last):
> File "print.py", line 5, in ?
> print u'Nezn\xe1m\xe1 chyba vzd\xe1len\xe9ho napaden\xed v= OpenSSH (4)'
> UnicodeError: ASCII encoding error: ordinal not in range(128)
> shell returned 1
V tisku unicodu je ten problem, ze pokud retezec obsahuje znaky,
ktere neumi vystupni zarizeni zobrazit, nastane prave tato vyjimka.
Jakou znakovou sadu umi terminal, lze zjistit prikazem
sys.getdefaultencoding(). Pokud mam v promenne ``u'' nejaky unicodovy
retezec, ``print u'' se potom chova, jako kdyby bylo volano
print u.encode(sys.getdefaultencoding())
Aspon v mem pythonu vrati sys.getdefaultencoding() hodnotu 'ascii'
a ve znakove sade ascii ceske znaky samozrejme nejsou. Proto
print u'ahoj' projde, ale print u'\u011b\u0161\u010d\u0159' neprojde.
Resenim je explicitni prekodovani do znakove sady, kterou vystupni
zarizeni podporuje ('iso8859-2', 'cp1250'...) :
print u'\u011b\u0161\u010d\u0159'.encode('iso8859-2')
Pokud bych ovsem v unicodovem retezci mel nejake cinske znaky,
zhavaruje i tohle.
Explicitnimu prekodovani se lze vyhnout pouzitim wrapperu nad stdout,
ktery provede prekodovani unicodovych objektu do pozadovane znakove sady:
---------------------------------------------
#!/usr/bin/env python
import sys, types
class StdoutWrapper :
def __init__ (self, fd) :
self.fd = fd
def write (self, o) :
if type(o) == types.UnicodeType :
o = o.encode('iso8859-2')
self.fd.write(o)
sys.stdout = StdoutWrapper(sys.stdout)
print u'ahoj'
print 'ahoj'
print u'\u011b\u0161\u010d\u0159'
---------------------------------------------
Mrknete take na http://www.reportlab.com/i18n/python_unicode_tutorial.html
Zdravi
Radek Kaňovský
Další informace o konferenci Python