[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