Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2013 22:58:25

nesergen
Зарегистрирован: 2013-01-20
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

метод format() для строк с русскими буквами

имеется простой скрипт:

# -*- 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 . В чем проблема, как можно решить? Мне нужно выводить на печать таблицу с ровными столбцами, для этого и использую дополнение длины строки. В реальных условиях из-зи данного дефекта ровные столбцы не получаются даже при использовании моноширинного шрифта.

Отредактировано nesergen (Дек. 5, 2013 23:02:05)

Офлайн

#2 Дек. 5, 2013 23:08:53

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

метод format() для строк с русскими буквами

ваш код, выполненный мною:

>>> 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'>



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Дек. 6, 2013 13:11:46

nesergen
Зарегистрирован: 2013-01-20
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

метод format() для строк с русскими буквами

уточняю:
на питоне 2.7 выходит косяк
на питоне 3.2 всё в порядке

Решение нашел. Всё работает привидением всех строк к Юникоду.
Но всё равно не понятно, что же делает питон с обычными строками, что выводит меньше знаков чем надо, а считает количество столько сколько надо?

Отредактировано nesergen (Дек. 6, 2013 13:20:50)

Офлайн

#4 Дек. 6, 2013 13:49:46

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

метод format() для строк с русскими буквами

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

..bw



Офлайн

#5 Дек. 6, 2013 14:14:07

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

метод format() для строк с русскими буквами

в python2 используй юникодные строковые литералы

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version