Python 2.X: почему я не могу правильно обрабатывать Unicode?

Я некоторое время экспериментировал с Python 2.Xи юникодом. Но я достиг точки, когда это не имеет смысла.

Первая проблема:

Некоторый код ясно объяснит, что я имею в виду.Переменная txt предназначена для имитации функции перевода pyqt4. Который возвращает QString.

# -*- coding: utf-8 -*-
from PyQt4 import QtCore
txt = QtCore.QString(u'può essere / sarà / 日本語')
txtUnicode1 = unicode(txt, errors='replace')
txtUnicode2 = unicode(txt)

Когда print() выполняет две строки Юникода, я получаю:

pu� essere / sar� / ???

può essere / sarà / 日本語

Конечно, я мог бы получить то же самое, используя QString.__str__(), но я хочу понять, поэтому ради аргумента я хотел бы знать:

  • Почему error='replace' заменяет все закодированные символы, когда это нужно делать только в случае ошибок?
  • Есть ли проблема с использованием unicode(QString) для создания QString? в строку юникода, пригодную для отображения?

Вторая проблема:

Я пытаюсь понять кодирование/декодирование.

>>> a = u'può essere / sarà / 日本'
>>> b = a.encode('utf-8')
>>> a
u'pu\xf2 essere / sar\xe0 / \u65e5\u672c'
>>> b
'pu\xc3\xb2 essere / sar\xc3\xa0 / \xe6\x97\xa5\xe6\x9c\xac'
>>> print a
può essere / sarà / 日本
>>> print b
può essere / sarà / 日本
  • Расшифровывает ли print a и b?
  • Предполагается, что кодировка-кодировка UTF-8 расшифровали полностью? Разве я не должен напечатать закодированную строку?
  • В чем разница между закодированной и декодированной строкой Unicode?
7
задан Aki 8 March 2012 в 16:30
поделиться