2016-10-13 10 views
2

Я добытые строкой из веб ползать сценарий следующим образом:Python, как декодировать Юникод с шестигранными символами

u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91' 

Я хочу, чтобы декодировать u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91' с UTF-8. С http://ddecode.com/hexdecoder/, я вижу, что результат '【中字】'

Я пробовал использовать следующий синтаксис, но не смог.

msg = u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91' 
result = msg.decode('utf8') 

Ошибка:

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) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordi 
nal not in range(128) 

Могу ли я спросить, как правильно декодировать строку?

Спасибо за помощь.

+2

Строка, которую вы получаете, закодирована в двойном порядке. Он отлично работает без 'u' перед строкой. Вы должны проверить скрипт сканирования. –

ответ

1

проблема с

msg = u'\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91' 
result = msg.decode('utf8') 

является то, что вы пытаетесь расшифровать Unicode. Это не имеет смысла. Вы можете кодировать от Unicode к некоторому типу кодирования, или вы можете декодировать строку байта до Unicode.

Когда вы

msg.decode('utf8') 

Python 2 видит, что msg является Unicode. Он знает, что он не может декодировать Unicode, поэтому он «полезно» предполагает, что вы хотите кодировать msg с кодеком ASCII по умолчанию, поэтому результат этого преобразования может быть декодирован в Unicode с использованием кодека UTF-8. Python 3 ведет себя гораздо более разумно: что код будет просто не с

AttributeError: 'str' object has no attribute 'decode' 

техникой, приведенным в ответе kennytm в:

msg.encode('latin1').decode('utf-8') 

работах, так как Unicode кодового менее 256 соответствуют непосредственно символам в Latin1 кодирование (также известный как ISO 8859-1).

Вот некоторые Python 2 код, который иллюстрирует это:

for i in xrange(256): 
    lat = chr(i) 
    uni = unichr(i) 
    assert lat == uni.encode('latin1') 
    assert lat.decode('latin1') == uni 

А вот эквивалент Python 3 код:

for i in range(256): 
    lat = bytes([i]) 
    uni = chr(i) 
    assert lat == uni.encode('latin1') 
    assert lat.decode('latin1') == uni 

Вы можете найти эту статью полезной: Pragmatic Unicode, который был написан SO ветеран Нед Батчелдер.

Если вы не используете Python 2, я настоятельно рекомендую вам перейти на Python 3. Это сделает обработку Unicode менее болезненной.

0

Просто сохраните msg как строку, а не unicode.

msg = '\xe3\x80\x90\xe4\xb8\xad\xe5\xad\x97\xe3\x80\x91' 
result = msg.decode('utf8') 
+0

Я пробовал это раньше, но также не смог. Я получил ошибку, как «UnicodeEncodeError: кодек ascii не может кодировать символы в позиции 0-11: ordi nal не в диапазоне (128)» –

2
  1. Может быть, вы должны исправить сценарий обхода вместо этого, строка Unicode должна содержать u'【中字】' (u'\u3010\u4e2d\u5b57\u3011') уже, вместо исходных UTF-8 байт.

  2. Чтобы преобразовать msg в правильную кодировку, сначала нужно включить неправильную строку Unicode обратно в байт строки (кодировать его в Latin-1), затем расшифровывает его как UTF-8:

    >>> print msg.encode('latin1').decode('utf-8') 
    【中字】 
    
+0

WOW, поэтому msg.encode ('latin1') означает превратить его в байтовую строку , Кажется, работает !!! Большое спасибо!!! –

+0

@ShootingChuang Вид рода. :) Подробнее см. Мой ответ и связанную статью Википедии. –