Найти - Пользователи
Полная версия: метод format() для строк с русскими буквами
Начало » Python для новичков » метод format() для строк с русскими буквами
1
nesergen
имеется простой скрипт:

# -*- coding: utf-8 -*-
asd=("йцу", "ЫПРОИЬТБ", "ВАПпрпА АРИ")
for x in asd:			
    txt="{:*<20s}".format(x)
    print txt, "	len() =",len(txt),  " symbols", type(txt)

из списка берутся слова с русскими буквами и форматируются (делается левое выравнивание и дополнение до 20-ти символов). Далее происходит печать полученного текста. Далее приводится результат:

йцу************** len() = 20 symbols <type ‘str’>
ЫПРОИЬТБ**** len() = 20 symbols <type ‘str’>
ВАПпрпА АРИ len() = 21 symbols <type ‘str’>

из чего видно, что длина слова по символам не соответствует расчетному значению метода len().
Данный косяк встречается с буквами не входящими в кодировку ASCII . В чем проблема, как можно решить? Мне нужно выводить на печать таблицу с ровными столбцами, для этого и использую дополнение длины строки. В реальных условиях из-зи данного дефекта ровные столбцы не получаются даже при использовании моноширинного шрифта.
JOHN_16
ваш код, выполненный мною:
>>> asd=("йцу", "ЫПРОИЬТБ", "ВАПпрпА АРИ")
>>> for x in asd:
...     txt="{:*<20s}".format(x)
...     print txt, "    len() =",len(txt),  " symbols", type(txt)
...
йцу*****************    len() = 20  symbols <type 'str'>
ЫПРОИЬТБ************    len() = 20  symbols <type 'str'>
ВАПпрпА АРИ*********    len() = 20  symbols <type 'str'>
nesergen
уточняю:
на питоне 2.7 выходит косяк
на питоне 3.2 всё в порядке

Решение нашел. Всё работает привидением всех строк к Юникоду.
Но всё равно не понятно, что же делает питон с обычными строками, что выводит меньше знаков чем надо, а считает количество столько сколько надо?
bw
Вы ведь знаете, что UTF-8, это кодировка с не фиксированным размером кода символа? `str` это набор байт (речь о Python2), а не набор символов. И то что эти байты, это строка в кодировке UTF-8, это только в вашей голове, интерпретатору ничего об этом не известно. В `str` кстати, с таким же успехом и JPEG храниться может, что тогда должен показать `len` :-) ?

..bw
bismigalis
в python2 используй юникодные строковые литералы
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB