[python] Unicode/ne-unicode problem

Petr Messner petr.messner na gmail.com
Středa Květen 2 13:33:08 CEST 2012


Ono to možná nikam nevede. Bez posledních dvou znaků je to OK:

>>> print "\xC3\xBD \xC3\xB7 \xC3\xAD".decode("utf8")
ý ÷ í

Ono za \xC3 musí z definice UTF-8 následovat bajt, který má nastavený
nejvyšší bit, a to obyčejná tečka není snad v žádném kódování, rozhodně v
žádném založeném na ASCII jako je cp1250, latin1, latin2 atd.

Prostě si myslím, že tohle: 'Ă˝ á Ă­ Ă.' je špatně, nějak useknuté, něco
vynechané apod.

Můžete nám ten zdroj dat v UTF-8 nějak popsat? Je to nějaká databáze?

PM


Dne 2. května 2012 13:08 Jaroslav Lukesh <lukesh na seznam.cz> napsal(a):

> Mezitím jsme v jiném threadu zjistili, že jde o utf8 zapsané v cp1250, ale
> i tak mám tohle - Python 2.4.6:
>
>
>  a='Ă˝ á Ă­ Ă.'
>>>> repr(a)
>>>>
>>> "'\\xc3\\xbd \\xc3\\xb7 \\xc3\\xad \\xc3.'"
>
>> a.decode("cp1250")
>>>>
>>> u'\u0102\u02dd \u0102\xb7 \u0102\xad \u0102.'
>
>> print eval(a).decode("cp1250")
>>>>
>>> Traceback (most recent call last):
>  File "<stdin>", line 1, in ?
>  File "<string>", line 1
>   Ă˝ á Ă­ Ă.
>   ^
> SyntaxError: invalid syntax
>
>>
>>>>
> No teď už jenom to reverznout z cp1250 na utf8 a to pak už správně převést
> na cp1250. jenže necode/decode neumí vzít 2 parametry pro kódování, tak se
> to pokusím zřetězit:
>
>  a.decode('cp1250')
>>>>
>>> u'\u0102\u02dd \u0102\xb7 \u0102\xad \u0102.'
>
>> a.decode('cp1250').encode('**utf8')
>>>>
>>> '\xc4\x82\xcb\x9d \xc4\x82\xc2\xb7 \xc4\x82\xc2\xad \xc4\x82.'
>
> Sice jsem pokročil, ale je to nějak delší a delší.
>
>
> ----- Původní zpráva ----- Od: "Petr Přikryl" <prikryl na atlas.cz>
>
>
> Já vidím tohle:
>
>  rr = "'\\xc3\\xbd \\xc3\\xb7 \\xc3\\xad \\xc3.'"
>>>> a = eval(rr)
>>>> a
>>>>
>>> '\xc3\xbd \xc3\xb7 \xc3\xad \xc3.'
>
>> u = a.decode('utf-8')
>>>>
>>> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
>  File "c:\Python27\lib\encodings\**utf_8.py", line 16, in decode
>   return codecs.utf_8_decode(input, errors, True)
> UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 9:
> invalid continuation byte
>
>
> To rr je okopírované tvoje repr.  Pomocí eval() to převedu na hodnotu a.
> Pak volám
> a.decode('utf-8') a ono to jinými slovy říká, že to není v utf-8.
>
> P.
> ______________________________**______________________________**__
>
>> Od: "Jaroslav Lukesh" <lukesh na seznam.cz>
>> Komu: Konference PyCZ <python na py.cz>
>> Datum: 02.05.2012 11:52
>> Předmět: Re: [python] Unicode/ne-unicode problem
>>
>> Je to proměnná, kde obsah byl získaný ze streamu dat.
>>
>>  a='Ă˝ á Ă­ Ă.'
>>>>> repr(a)
>>>>>
>>>> "'\\xc3\\xbd \\xc3\\xb7 \\xc3\\xad \\xc3.'"
>>
>> Dík, JL.
>>
>>
>> ----- Původní zpráva ----- Od: "Petr Přikryl" <prikryl na atlas.cz>
>>
>>
>> Ten nečitelný řetězec je zapsaný ve zdrojovém textu, nebo je načtený ze
>> souboru?
>> Když mám v proměnné UTF-8 bajty, tak musím udělat .decode() nebo
>> unicode(),
>> ale jako parametr musím uvést to 'utf-8'.
>>
>> Posloupnost bajtů v kódovaní UTF-8 je jednou z možných reprezentací
>> Unicode
>> řetězce.  Vznikla tedy zakódováním (například u.encode('utf-8'))
>> unicodového
>> řetězce.
>> Když z toho chci dostat zpět Unicode řetězec, musím provést dekódování,
>> takže u = s.decode('utf-8') nebo u = unicode(s, 'utf-8').
>>
>> Je možné, že je ta posloupnost bajtů porušená, pak to může řvát, že neví
>> co
>> s tím.
>> Pošli sem, jak vypadá repr(a) (pokud je to pro Python 2).
>>
>> Ptej se dál, ono se to vyjasní.
>>
>> P.
>>
>> ______________________________**______________________________**__
>>
>>> 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<http://www.py.cz/mailman/listinfo/python>
>>>
>>>  ______________________________**_________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/**listinfo/python<http://www.py.cz/mailman/listinfo/python>
>>
>> ______________________________**_________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/**listinfo/python<http://www.py.cz/mailman/listinfo/python>
>>
>>  ______________________________**_________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/**listinfo/python<http://www.py.cz/mailman/listinfo/python>
> ______________________________**_________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/**listinfo/python<http://www.py.cz/mailman/listinfo/python>
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20120502/993505a8/attachment.html>


Další informace o konferenci Python