[python] Unicode/ne-unicode problem

Jaroslav Lukesh lukesh na seznam.cz
Středa Květen 2 13:08:36 CEST 2012


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
>>
>_______________________________________________
>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ší informace o konferenci Python