Китайская кодировка символов - PullRequest
0 голосов
/ 09 мая 2018

мой код указан ниже.
Я не знаю, почему не могу печатать по-китайски. Пожалуйста помоги.

Когда вы пытаетесь напечатать более одной переменной в строке, слова выглядят как ascii или raw type.

Как это исправить?

# -*- coding: utf-8 -*-
import pygoldilocks
import sys
reload(sys)  
sys.setdefaultencoding('utf8')

rows = ( '已','经激活的区域语言' )
print( rows[0] )
print( rows[1] )
print( rows[0], rows[1] )
print( rows[0].encode('utf8'), rows[1].decode('utf8') )
print( rows[0], 1 )


$ python test.py
已
经激活的区域语言
('\xe5\xb7\xb2', '\xe7\xbb\x8f\xe6\xbf\x80\xe6\xb4\xbb\xe7\x9a\x84\xe5\x8c\xba\xe5\x9f\x9f\xe8\xaf\xad\xe8\xa8\x80')
('\xe5\xb7\xb2', u'\u7ecf\u6fc0\u6d3b\u7684\u533a\u57df\u8bed\u8a00')
('\xe5\xb7\xb2', 1)

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Есть два менее радикальных решения, чем обновление до Python 3.

Первый - не использовать синтаксис Python 3 print():

rows = ( '已','经激活的区域语言' )
print rows[0] 
print rows[1] 
print rows[0], rows[1] 
print rows[0].decode('utf8'), rows[1].decode('utf8') 
print rows[0], 1

已
经激活的区域语言
已 经激活的区域语言
已 经激活的区域语言
已 1

Второй - импортировать синтаксис Python 3 print() в Python 2:

from __future__ import print_function

rows = ( '已','经激活的区域语言' )
print (rows[0]) 
print (rows[1])
print (rows[0], rows[1]) 
print (rows[0].decode('utf8'), rows[1].decode('utf8'))
print (rows[0], 1)

Вывод такой же.

И брось этот sys.setdefaultencoding() звонок. Он не предназначен для такого использования (только в модуле site) и приносит больше вреда, чем пользы.

0 голосов
/ 09 мая 2018

Все ваши выходы в норме. Кстати, это:

reload(sys)  
sys.setdefaultencoding('utf8')

на самом деле хитрость для бедного человека, чтобы установить кодировку Python по умолчанию. Это редко действительно полезно - ИМХО, это не показано в коде - и должно использоваться только тогда, когда нет более чистого способа. Я использовал Python 2 десятилетиями с кодировкой, отличной от ascii (Latin1), и использовал это только в моих самых первых скриптах.

И # -*- coding: utf-8 -*- здесь также не используется Python, хотя это может быть полезно для вашего текстового редактора: это имеет смысл, только если у вас есть unicode буквенные строки в вашем скрипте - то, чего у вас нет .

Теперь, что на самом деле происходит:

Вы определяете row как 2 кортежа (байтовых) строк, содержащих китайские символы, закодированные в utf8. Хорошо.

Когда вы печатаете строку, символы передаются непосредственно в систему вывода (здесь терминал или экран). Поскольку он правильно обрабатывает UTF8, он преобразует представление байта utf8 в соответствующие символы. Таким образом, print (row[0]) (который выполняется как print row[0] в Python 2 - (row[0]) не является кортежем, (row[0],) является 1-кортежем) правильно отображает китайские символы.

Но когда вы печатаете кортеж, Python фактически печатает представление элементов кортежа (оно будет одинаковым для списка, набора или карты). А в Python 2 представление строки байта или юникода кодирует все не ASCII-символы в \x.. из \u.... форм.

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

>>> print rows[0]
已
>>> print repr(rows[0])
'\xe5\xb7\xb2'

TL / DR: когда вы печатаете контейнеры, вы фактически печатаете представление элементов. Если вы хотите отобразить строковые значения, используйте явный цикл или объединение:

print '(' + ', '.join(rows) + ')'

отображается как положено:

(已, 经激活的区域语言)
0 голосов
/ 09 мая 2018

Ваша проблема в том, что вы используете Python 2, я думаю. Ваш код

print( rows[0], rows[1] )

оценивается как

tmp = ( rows[0], rows[1] ) # a tuple!
print tmp # Python 2 print statement!

Поскольку форматирование по умолчанию для кортежей выполняется через repr(), вы видите экранированное ASCII представление.

Решение: обновление до Python 3.

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