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