Как напечатать китайское слово в моем коде .. используя Python - PullRequest
11 голосов
/ 22 апреля 2010

Это мой код:

print '哈哈'.decode('gb2312').encode('utf-8')

... и печатает:

SyntaxError: Non-ASCII character '\xe5' in file D:\zjm_code\a.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Как мне напечатать '哈哈'?

Обновление: Когда я использую следующий код:

#!/usr/bin/python
# -*- coding: utf-8 -*-

print '哈哈'

... печатает 鍝堝搱. Это не то, что я хотел получить.

Моя IDE - это Ulipad, это ошибка в IDE?

Второе обновление:

Этот код будет печатать правильные символы:

#!/usr/bin/python
# -*- coding: utf-8 -*-


print u'哈哈'.encode('gb2312')

... и когда я использую это:

#!/usr/bin/python
# -*- coding: utf-8 -*-

a='哈哈'
print a.encode('gb2312')
Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 5, in <module>
    print a.encode('gb2312')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

... или ...

#!/usr/bin/python
# -*- coding: utf-8 -*-

a='哈哈'
print unicode(a).encode('gb2312')
Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 5, in <module>
    print unicode(a).encode('gb2312')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

... это не работает. Как бы я распечатал переменную a соответствующим образом?

спасибо

Ответы [ 6 ]

10 голосов
/ 22 апреля 2010

Сначала вам нужно объявить кодировку, как ясно сказано в сообщениях об ошибках - она ​​даже говорит вам посмотреть здесь для подробностей! Ваша кодировка предположительно gb2312.

Кстати, было бы проще (с тем же объявлением кодировки) сделать

print u'哈哈'.encode('utf-8')

и вам может даже не понадобиться часть encode, если ваш sys.stdout имеет атрибут encoding, установленный правильно (зависит от вашего терминала, ОС и т. Д.).

4 голосов
/ 22 апреля 2010

Вам необходимо указать кодировку файла исходного кода Python, вот кодировка для utf-8. Он идет в правом верхнем углу под путём интерпретатора Python.

#!/usr/bin/python
# -*- coding: utf-8 -*-

Если вы перейдете по ссылке в сообщении об ошибке , вы можете найти дополнительную информацию об указании кодировки исходного файла python.

Как только вы укажете кодировку исходного файла, вам не нужно будет декодировать текст.

2 голосов
/ 22 апреля 2010

У меня работает следующий код:

# coding: utf8
print u'哈哈'.encode('utf-8')

Комментарий #coding сообщает Python о кодировке самого файла, поэтому вы можете встраивать в него символы UTF-8 напрямую. И если вы начинаете со строки Unicode, вам не нужно декодировать и перекодировать.

1 голос
/ 01 марта 2018

Вам следует проверить кодировку символов терминала.

На моем терминале сначала я установил кодировку символов в utf-8, все в порядке.

Когда я устанавливаю его в GBK, результатом будет '鍝 堝 搱'.

1 голос
/ 24 ноября 2013

Вы не можете делать кодирование на символе Unicode. Кодирование используется для перевода всех символов, закодированных в Unicode, в другой стиль кода. Это не может быть использовано для Unicode персонажа.

В случае противоречия декодирование может использоваться только для символов, не закодированных в Unicode, для перевода в символы Unicode.

Если вы объявите строку с символом 'u' перед строкой, вы получите строку, закодированную в юникоде. Вы можете использовать isinstance (str, unicode), чтобы определить, закодирована ли str в unicode.

Попробуйте этот код ниже. Подсказка: в Windows с китайской версией стиль кода по умолчанию - "gbk".

>>> a = '哈哈'
>>> b = u '哈哈'
>>> isinstance (a, unicode)
Ложные
>>> isinstance (b, unicode)
True

>>> a
'\ Xb9 \ XFE \ xb9 \ XFE'
>>> б
U '\ u54c8 \ u54c8'

>>> a.decode ('gbk')
U '\ u54c8 \ u54c8'
>>> a_unicode = a.decode ('gbk')
>>> a_unicode
u '\ u54c8 \ u54c8'

>>> print a_unicode
哈哈
>>> a_unicode.encode ('gbk') == a
Правда
>>> a_unicode == b
True

>>> a.encode ('gbk')
Traceback (последний вызов был последним): Файл "", строка 1, в UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xb9 в позиции 0: порядковый номер не в диапазоне (128)

>>> b.decode ('gbk')
Traceback (последний вызов был последним): Файл "", строка 1, в UnicodeEncodeError: кодек «ascii» не может кодировать символы в позиции 0-1: порядковый номер не в диапазоне (128)

1 голос
/ 26 сентября 2012

На основании ответа Уилла Маккатчена это также работает:

# coding: utf8
print '哈哈'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...