[python] Re: cestina a python

Radovan Garabik garabik na kassiopeia.juls.savba.sk
Čtvrtek Duben 14 15:15:25 CEST 2005


Pavel Bařina <blade na blade-comp.com> wrote:
> Dobry den,
> omlouvam se za zacatecnicky dotaz. S pythonem teprve zacinam.
> Pochopil jsem ze python umi pracovat s unicode. 
> 
> #! /usr/bin/env python
> # -*- coding: iso-8859-2 -*-
> print u"Jsem rád, ze jsem te poznal."
> 
> Mi funguje bez problemu a ve funkci print je vypis ceskych znaku spravne.
> 

ale to len zhodou okolnosti ak je spravne nastavene sys.getdefaultencoding
bezpecne je pouzit print u"Jsem rád, ze jsem te poznal.".encode('iso2')
(a getdefaultencoding sa v python3.0 vraj zrusi)


> Kdyz ale napisu tohle :
> 
> #! /usr/bin/env python
> # -*- coding: iso-8859-2 -*-
> odpoved = raw_input(u"Jak se jmenujes?")
> print u"Tak ty se jmenujes %s! Jsem rad, ze jsem te poznal." % odpoved
> 
> Pri pouziti  funkce raw_input python hlasi chybu :
> 
> Traceback (most recent call last):
>  File "./otazka.py", line 3, in ?
>    odpoved = raw_input(u"Jak se jmenujes?")
> UnicodeEncodeError: 'ascii' codec can't encode character u'\u0161' in
> position 14: ordinal not in range(128)
> 
> Netusim proc unicode v tomto pripade nefunguje. Priklad spoustim jako script
> v konsoli v Linuxu. Dekuji moc za nakopnuti spravnym smerem.

asi raw_input sa neriadi nastavenim sys.getdefaultencoding. Dalo by sa
to povazovat za bug alebo design flaw, ale sys.getdefaultencodingje aj
tak depreciated. 
Dalsi problem sa prejavi ked clovek rovno zada nieco s diakritikou do
promptu, lebo raw_input nacita iba cistu postupnost bajtov, nevie nic o tom v
akom kodovani by sa mali nachadzat, lebo to je zalezitost terminalu (a
dokonca nemusi ani suvisiet s locale, aj ked nezhoda s locale by sa
prejavila inde)
riesenie je nieco ako:
odpoved = raw_input(u"Jak se jmenujes?".encode('iso2')).decode('iso2')

'iso2' v predchadzajucich pripadoch predpoklada iso2 system,
univerzalnejsie je zistit si nastavenie kodovania z locale, a
predpokladat ze terminal pouziva rovnake:

import locale
default = 'iso2'
iocharsetguess = locale.nl_langinfo(locale.CODESET) or default

a potom pouzivat iocharsetguess, to sice znamena ze bez dalsieho
osetrenia program spadne na nekompatibilnych locales (cize na hocicom
inom okrem utf-8, cp1250, iso2 a mozno nejakych CJK locales)

-- 
 -----------------------------------------------------------
| Radovan Garabík http://kassiopeia.juls.savba.sk/~garabik/ |
| __..--^^^--..__    garabik @ kassiopeia.juls.savba.sk     |
 -----------------------------------------------------------
Antivirus alert: file .signature infected by signature virus.
Hi! I'm a signature virus! Copy me into your signature file to help me spread!



Další informace o konferenci Python