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