Как печатать китайское слово в моем коде.. используя 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)

... или...

#!/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 соответствующим образом?

спасибо

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

# coding: utf8
print '哈哈'

Ответ 5

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

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

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

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

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

→ > a
'\ Xb9\XFE\xb9\XFE'
→ > b
U '\ u54c8\u54c8'

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

→ > распечатать 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)