как напечатать китайское слово в моем коде.. с помощью python

Это мой код:

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)

...or...

#!/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?

Благодарность


person zjm1126    schedule 22.04.2010    source источник
comment
Совет соотечественника,больше голосуйте,думайте прежде чем спрашивать,и будьте добрее :-)   -  person Young    schedule 22.04.2010


Ответы (6)


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

Кстати, было бы проще (с той же декларацией кодировки) сделать

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

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

person Alex Martelli    schedule 22.04.2010

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

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

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

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

person vfilby    schedule 22.04.2010

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

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

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

person Will McCutchen    schedule 22.04.2010

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

В противоречии с этим декодирование может использоваться только для символа, не закодированного в юникоде, для перевода в символ юникода.

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

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

>>> a = '哈哈'
>>> b = u'哈哈'
>>> isinstance(a,unicode)
False
>>> isinstance(b,unicode)
Правда

>>> a
'\xb9\xfe\xb9\xfe'
>>> b
u'哈哈'

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

>>> print a_unicode
哈哈
>>> a_unicode.encode('gbk') == a
True
>>> a_unicode == b
True

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

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

person heLomaN    schedule 24.11.2013

Основываясь на ответе Уилла Маккатчена, это также работает:

# coding: utf8
print '哈哈'
person HaoQi Li    schedule 26.09.2012

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

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

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

person yaiba    schedule 01.03.2018