[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