[python] Unicode/ne-unicode problem

Petr Messner petr.messner na gmail.com
Středa Květen 2 11:22:27 CEST 2012


Pokud jste do programu napsal

>>>> s='Ă˝ á Ă­ Ă.'
>>>> u = s.decode("utf8")

Pak musíte ten zdrojový kód uložit v kódování, pro které to bude fungovat a toto kódování deklarovat v hlavičce (-*- coding: cp1250). Možná bude lepší pracovat s hexadecimalnim zápisem těchto znaků, abychom se podobným problémům vyhnuli. Bohuzel teď nejsem u počítače, pak odpovím i s příkladem.

Petr Messner

2. 5. 2012 v 11:06, "Jaroslav Lukesh" <lukesh na seznam.cz>:

> Jenže právě toto nějak nejde, řve na tom "ř":
> 
>>>> s='Ă˝ á Ă­ Ă.'
>>>> u = s.decode("utf8")
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "/var/zope/python/lib/python2.4/encodings/utf_8.py", line 16, in decode
>   return codecs.utf_8_decode(input, errors, True)
> UnicodeDecodeError: 'utf8' codec can't decode bytes in position 9-10: invalid data
>>>> 
> 
> Tohle je převod "znaků":
> ě š č ř ž ý á í é ď ť ň ó ú ů ĺ ľ ŕ ö ë ä ü
> 
> Ä› š ÄŤ Ĺ™ Ĺľ Ă˝ á Ă­ Ă© ÄŹ ĹĄ Ĺ? Ăł Ăş ĹŻ Äş Äľ Ĺ• ö Ă« ä ĂĽ
> 
> Ě Š Č Ř Ž Ý Á Í É Ď Ť Ň Ó Ú Ů Ĺ Ľ Ŕ Ö Ë Ä Ü
> 
> Äš Ĺ  ÄŚ Ĺ? Ĺ˝ Ăť Ă? ĂŤ É ÄŽ Ť Ň Ă“ Ăš Ĺ® Äą Ä˝ Ĺ” Ă– Ă‹ Ă„ Ăś
> 
> vypadá to teda asi na mohutný replace, co?
> 
> 
> ----- Původní zpráva ----- Od: "Petr Messner" <petr.messner na gmail.com>
> 
> pokud v proměnné s máte 'Ă˝ á Ă­ Ă.', pak zavoláním u = s.decode("utf8") z toho dostanete unicode řetězec. S ním pak můžete dále pracovat nebo ho převést do jiného kódování. Pokud ho chcete zobrazit na Windows v kódování cp1250, zkuste u.encode("cp1250").
> 
> Je nutné si uvědomit, ze unicode řetězec nejde přímo zobrazit - vždy to bude jen nejaká jeho podoba v některém kódování. Třeba print v 2.x automaticky použije kódování např. z LANG. Je dobré v programu vždy pracovat s unicode, mit správně nastavené vstupy a výstupy tak, aby unicode správně kódovaly a dekódovaly, a pak se o nějaké kódování už vůbec nestarat. Samozřejmě pokud máte nejaky vstup, u kterého jste si jistý, že vám bude dodávat řetězce v utf-8, první (a jediné), co uděláte, je decode("utf-8") :)
> 
> Petr Messner
> 
> 2. 5. 2012 v 10:16, "Jaroslav Lukesh" <lukesh na seznam.cz>:
> 
>> Děkuji, ale nechápu, jak proměnné říct, že už obsahuje text v kódování UTF8.
>> 
>> Mám proměnnou, která obsahuje 'Ă˝ á Ă­ Ă.' tedy přesněji, toto je ve windowsech vidět, když si zobrazíte utf8 v cp1250. Python mám ale na Linuxu v LANG=cs_CZ.iso8859-2. Ty znaky v UTF8 tam jdou binárně zvenčí a nevím jak pythonu říct, že to má považovat za utf8.
>> 
>> Chtěl bych to udělat systémově, než na ten vstup poštvat 50x replace.
>> 
>> Děkuji, JL.
>> 
>> ----- Původní zpráva ----- Od: "Petr Přikryl" <prikryl na atlas.cz>
>> 
>> 
>> Nejjednodušší je to převést nejdříve do Unicode a druhým krokem do požadovaného
>> kódování. Tohle jsem dělal pod Windows na konzoli, která používá cp852:
>> 
>>>>> u = u"ě š č ř"
>>>>> u
>> u'\u011b \u0161 \u010d \u0159'
>>>>> s = u.encode('utf-8')
>>>>> s
>> '\xc4\x9b \xc5\xa1 \xc4\x8d \xc5\x99'
>>>>> u2 = s.decode('utf-8')
>>>>> u2
>> u'\u011b \u0161 \u010d \u0159'
>>>>> u3 = unicode(s, 'utf-8')
>>>>> u3
>> u'\u011b \u0161 \u010d \u0159'
>>>>> sLatin2 = u.encode('iso8859_2')
>>>>> sLatin2
>> '\xec \xb9 \xe8 \xf8'
>> 
>> .decode() nebo unicode() to převede na Unicode řetězec.
>> .encode() to převede na požadované kódování.
>> 
>> V názvu kódování má být oficiálně znak podtržení, ale
>> implementace toleruje i uvedení velkých písmen a pomlček.
>> 
>> Měj se,
>> Petr
>> 
>> ______________________________________________________________
>>> Od: "Jaroslav Lukesh" <lukesh na seznam.cz>
>>> Komu: Konference PyCZ <python na py.cz>
>>> Datum: 27.04.2012 10:35
>>> Předmět: [python] Unicode/ne-unicode problem
>>> 
>>> Dobrý den,
>>> 
>>> potřeboval bych dostat z binárních dat utf8 na vstupu normální neunicodový
>>> výstup, ale nějak mi to nejde.
>>> 
>>> Vstup: znaky "ě š č ř" v utf8 již v binární formě, systém je v iso8859-2
>>> 
>>> Čekám že z toho nějak dostanu "ě š č ř" ale pořád nic. Jak mu říct, že 'Ă˝
>>> á Ă­ Ă.' je už v utf8?
>>> 
>>> Děkuji, JL.
>>> 
>>>>>> a='Ă˝ á Ă­ Ă.'
>>>>>> A=unicode(a,'iso8859-2')
>>>>>> print a
>>> Ă˝ á Ă­ Ă.
>>>>>> A=unicode(a,'utf8')
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in ?
>>> File "/var/zope/python/lib/python2.4/encodings/utf_8.py", line 16, in
>>> decode
>>>  return codecs.utf_8_decode(input, errors, True)
>>> UnicodeDecodeError: 'utf8' codec can't decode bytes in position 9-10:
>>> invalid data
>>> 
>>>>>> A.encode('iso8859-2')
>>> '\xc3\xbd \xc3\xb7 \xc3\xad \xc3.'
>>> 
>>>>>> a.encode('iso8859-2')
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in ?
>>> File "/var/zope/python/lib/python2.4/encodings/iso8859_2.py", line 18, in
>>> encode
>>>  return codecs.charmap_encode(input,errors,encoding_map)
>>> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
>>> ordinal not in range(128)
>>>>>> 
>>> 
>>>>>> A.decode('iso8859-2')
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in ?
>>> File "/var/zope/python/lib/python2.4/encodings/iso8859_2.py", line 22, in
>>> decode
>>>  return codecs.charmap_decode(input,errors,decoding_map)
>>> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1:
>>> ordinal not in range(128)
>>>>>> a.decode('iso8859-2')
>>> u'\u0102\u02dd \u0102\u02c7 \u0102\xad \u0102.'
>>>>>> a.decode('utf8')
>>> Traceback (most recent call last):
>>> File "<stdin>", line 1, in ?
>>> File "/var/zope/python/lib/python2.4/encodings/utf_8.py", line 16, in
>>> decode
>>>  return codecs.utf_8_decode(input, errors, True)
>>> UnicodeDecodeError: 'utf8' codec can't decode bytes in position 9-10:
>>> invalid data
>>>>>> 
>>> 
>>> 
>>> _______________________________________________
>>> Python mailing list
>>> Python na py.cz
>>> http://www.py.cz/mailman/listinfo/python
>>> 
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python 
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20120502/fb7444f3/attachment.html>


Další informace o konferenci Python