как получить мой характер? - PullRequest
0 голосов
/ 26 января 2012

моя система: xp + python27 кодек, xp gbk; python 27 ascii

>>> a = '你好'    
>>> a   
'\xc4\xe3\xba\xc3'  
>>> print a  
你好  
>>> '\xc4\xe3\xba\xc3'.decode('gbk')  
u'\u4f60\u597d'  
>>> '\xc4\xe3\xba\xc3'.encode('gbk')   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal
not in range(128)   

Как я могу получить "你好" из '\ xc4 \ xe3 \ xba \ xc3'?

Ответы [ 3 ]

6 голосов
/ 26 января 2012

Это работает, потому что вы декодируете байты в юникод:

'\xc4\xe3\xba\xc3'.decode('gbk')

Это не так, потому что вы пытаетесь кодировать байты (которые уже закодированы):

'\xc4\xe3\xba\xc3'.encode('gbk')

Сообщение об ошибке в Python 2 здесь бесполезно, но вы должны использовать кодирование только для строк Unicode:

u'\u4f60\u597d'.encode('gbk')   # Gets you back the bytes you had before.

В Python 2 простое выполнение a в интерактивной подсказке покажет не-ascii символы в экранированных строках (например, \xc3 или \u4f60). Вы можете сделать print a для отображения символов. Или используйте Python 3, который будет отображать строки, включая символы Юникода.

0 голосов
/ 26 января 2012

он означает, что при кодировании и печати он не отображается по необходимости

>>> a = u'\u4f60\u597d'.encode('gbk')
>>> print a
���
>>> a
'\xc4\xe3\xba\xc3'

Но если указать:

>>> a = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print a
你好

Вы должны использовать:

>>> c = '\xe4\xbd\xa0\xe5\xa5\xbd'.decode('gbk')
>>> c
u'\u6d63\u72b2\u30bd'
>>> c = c.encode('gbk')
>>> print c
你好
0 голосов
/ 26 января 2012

Ваша оболочка Python не может распечатать закодированную строку gbk. Он там, вы просто не можете его напечатать.

...