Форматирование строки Python + UTF-8 странное поведение - PullRequest
3 голосов
/ 20 сентября 2010

При печати отформатированной строки с фиксированной длиной (например, %20s) ширина отличается от строки UTF-8 до обычной строки:

>>> str1="Adam Matan"
>>> str2="אדם מתן"
>>> print "X %20s X" % str1
X           Adam Matan X
>>> print "X %20s X" % str2
X        אדם מתן X

Обратите внимание на разницу:

X           Adam Matan X
X        אדם מתן X

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 20 сентября 2010

Необходимо указать, что вторая строка - это Unicode, поместив u перед строкой:

>>> str1="Adam Matan"
>>> str2=u"אדם מתן"
>>> print "X %20s X" % str1
X           Adam Matan X
>>> print "X %20s X" % str2
X              אדם מתן X

Это позволит Python знать, что он считает символы Юникода, а не только байты.

3 голосов
/ 20 сентября 2010

В Python 2 нефиксированные строковые литералы имеют тип str, который является байтовой строкой . Он хранит произвольные байты, а не символы. UTF-8 кодирует некоторые символы с более чем одним байтом. Поэтому str2 содержит больше байтов, чем фактических символов, и показывает неожиданное, но совершенно правильное поведение при форматировании строки. Если вы посмотрите на фактическое байтовое содержимое этих строк (используйте repr вместо print), вы увидите, что в обеих строках длина поля на самом деле составляет 20 байтов (не символов!) .

Как уже упоминалось, решение состоит в том, чтобы использовать строки Unicode. При работе со строками в Python вам абсолютно необходимо понимать и понимать разницу между строками Unicode и байтов.

1 голос
/ 20 сентября 2010

Попробуйте так:

>>> str1="Adam Matan"
>>> str2=unicode("אדם מתן", "utf8")
>>> print "X %20s X" % str2
X              אדם מתן X
>>> print "X %20s X" % str1
X           Adam Matan X
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...