[python] Unicode řetězce
Radek Kubicek
xkubic23 na stud.fit.vutbr.cz
Pondělí Únor 6 17:26:53 CET 2006
> urcite by priste bylo vhodne napsat i tu vyjimku, ta je totiz skoro to
> nejpodstatnejsi :-)
No to ja vim, jenze je pokazde jina :-( Ta, ktera se vyskytne pri
presmerovani vystupu do souboru je takova:
Traceback (most recent call last):
File "test.py", line 15, in ?
courses.add_course('P┼Ö', 'p┼Ö├şrodopis')
File "c:\_zdrojaky\scholar\src\common\courses.py", line 115, in add_course
_L.info_message("Course %s [%s] already exists - can't be added." %
(code, n
ame))
File "c:\_zdrojaky\scholar\src\common\logs.py", line 18, in info_message
print "<info>", msg.decode('utf-8')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0159' in
position 8
: ordinal not in range(128)
Na vlozeni stringu do aplikace pouzivam funkci decode_string(), ktera je
takova (ta cast s encode by snad sla i vypustit):
def decode_string(string):
"""Decode string to UTF-8 coding."""
encs = ('utf-8', sys.getfilesystemencoding(), 'iso-8859-15')
for enc in encs:
try:
string = str(string).decode(enc)
except UnicodeError:
continue
break
if not isinstance(string, str):
string = string.encode('utf-8')
return string
Ne vypis potom retezec.decode('utf-8'). Pisu to pod windows, ale musi to
jit pouzivat hlavne pod Linuxem.
> Predpokladejme, ze je zrejme asi neco jako UnicodeDecodeError 'ascii'
> codec can't decode byte... atd. V takovem pripade budes muset nejprve
> odhadnout vychozi kodovani toho 'nejakeho retezce', ktery chces prevest.
> Prislusny algoritmus na to je ve wiki.
Kterou wiki mate na mysli?
Asi takhle... ta aplikace by mela byt prevazne graficka (ve wxPythonu),
takze budu potrebovat hlavne dobre pracovat s Unicode ve wx. Ale take
asi bude potreba, aby aplikace vypisovala informace na konzoli, takze
musim byt schopny nejen prevadet retezce pomoci print, ale tez i
predavat je do ovladacich prvku a tak. Jak resite unicode v programech
vy ostatni? Cim jednodussi reseni, tim lepe :-)
> Jinak nedoporucuji promenne nazyvat stejnymi nazvy jako vestavene funkce:
>>>> str
> <type 'str'>
No jasne, to bylo jen na ukazku :-)
Pekny den,
RK
Další informace o konferenci Python