Форматирование unicode строк
Вы знали, что если одно из значений строкового выражения с оператором %
- unicode, то вся результирующая строка будет тоже unicode?
>>> "Hello, %s" % u"Alex"
u'Hello, Alex'
>>> "Hello, %s" % u"Алексей"
u'Hello, \u0410\u043b\u0435\u043a\u0441\u0435\u0439'
Я привык пользоваться методом .format
для форматирования строк и его поведение мне больше нравится: тип исходной строки всегда сохраняется, а если в качестве параметра даются не ascii символы, то возбуждается исключение UnicodeEncodeError
.
>>> "Hello, {0}".format(u"Alex")
'Hello, Alex'
>>> "Hello, {0}".format(u"Алексей")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
>>> u"Hello, {0}".format(u"Алексей")
u'Hello, \u0410\u043b\u0435\u043a\u0441\u0435\u0439'
А большая ли разница, что вернется - обычная строка или строка unicode? Иногда да, например в случае с urlparse.parse_qs, тип строки имеет значение.
Т.е. нужно иметь в виду, что код вида:
>>> "Hello, %s" % value
вполне может вернуть unicode строку.
Ссылки: