Форум сайта python.su
0
Добрый день.
Подскажите по строкам.
Вот есть у меня строка неизвестная, допустим с кириллицей, мне нужно сделать срез и вывести 5 символов, т.к. строка unicode я делаю срез увеличив число в 2 раза, т.е. str.
Но вот встает вопрос, а что если в строке будет как кириллица, так и латинские символы, да пускай даже цифры и знаки препинания, то срез получится не верный и выведет другое количество символов.
Можно конечно формировать строку нужной длины идя по символам строки циклом, но мне кажется, что это слишком кривой вариант и есть, что-то изящнее.
Спасибо.
Офлайн
15
Скорее всего вы работаете с ASCII строкой (тип str), чтобы это была unicode-строка (тип unicode) нужно использовать символ u перед строкой, простой пример:
# -*- coding: utf-8 -*- s1 = 'Модернизация' # Тип str() s2 = u'Модернизация' # Тип unicode() print len(s1), len(s2) # Длина строк 24 12 s3 = u'город Miami' print s3[3:9] # од Mia
Отредактировано smoke853 (Ноя. 8, 2013 10:55:19)
Офлайн
0
smoke853Вы ошибаетесь.
Скорее всего вы работаете с ASCII строкой (тип str), чтобы это была unicode-строка (тип unicode) нужно использовать символ u перед строкой, простой пример:
>>> s1 = 'Модернизация' >>> s2 = u'Модернизация' >>> print(len(s1), len(s2)) (24, 24) >>> s1 == s2 False >>> s1 '\xd0\x9c\xd0\xbe\xd0\xb4\xd0\xb5\xd1\x80\xd0\xbd\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f' >>> s2 u'\xd0\x9c\xd0\xbe\xd0\xb4\xd0\xb5\xd1\x80\xd0\xbd\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd1\x8f'
Офлайн
15
Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04
http://savepic.su/3735806.jpg
Офлайн
0
smoke853Действительно странно, у меня такая же система и такие же версии.
Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04http://savepic.su/3735806.jpg
Офлайн
15
Jah, я думаю тут дело в кодировке. А попробуйте сделать вот так:
s = unicode('Модернизация', 'utf-8') print len(s)
Офлайн
14
во-первых впервые вижу что-бы len() выдавал количество байт а не символов , но по сути если уж правда то что вы говорите то сделайте так
#!/usr/bin/python #-*- coding: utf-8 -*- aaa = 'some string'.decode('utf8')[3:8] print len(aaa) aaa.encode('utf8')
Отредактировано @cckyi_boxxx (Ноя. 8, 2013 13:12:29)
Офлайн
0
Спасибо Товарищи, вы мне очень помогли и оказались правы, дело в кодировке! Пощупал немного строки и теперь почерпнул для себя некоторые нюансы работы со строками.
Отредактировано Jah (Ноя. 8, 2013 14:29:48)
Офлайн
47
и какая была кодировка?
Офлайн
0
bismigalisДа кодировка то у меня везде utf-8, только почему то её приходится явно указывать:
и какая была кодировка?
print unicode(data["surname"], 'utf-8')[:3].encode("utf-8")
print unicode(data["surname"])[:3].encode("utf-8") Traceback (most recent call last): File "main.py", line 41, in <module> main() File "main.py", line 34, in main print unicode(data["surname"])[:3].encode("utf-8") UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
Офлайн