Jah
Ноя. 8, 2013 09:47:59
Добрый день.
Подскажите по строкам.
Вот есть у меня строка неизвестная, допустим с кириллицей, мне нужно сделать срез и вывести 5 символов, т.к. строка unicode я делаю срез увеличив число в 2 раза, т.е. str.
Но вот встает вопрос, а что если в строке будет как кириллица, так и латинские символы, да пускай даже цифры и знаки препинания, то срез получится не верный и выведет другое количество символов.
Можно конечно формировать строку нужной длины идя по символам строки циклом, но мне кажется, что это слишком кривой вариант и есть, что-то изящнее.
Спасибо.
smoke853
Ноя. 8, 2013 10:49:43
Скорее всего вы работаете с 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 11:05:37
Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04
http://savepic.su/3735806.jpg
Jah
Ноя. 8, 2013 11:27:01
smoke853
Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04http://savepic.su/3735806.jpg
Действительно странно, у меня такая же система и такие же версии.
Но как оказалось, что вывод в IDLE и обычном скрипте у меня отличается. Не знаю с чем это может быть связано.
Спасибо за пример, дальше уже буду копать и разбираться.
smoke853
Ноя. 8, 2013 11:33:47
Jah, я думаю тут дело в кодировке. А попробуйте сделать вот так:
s = unicode('Модернизация', 'utf-8')
print len(s)
@cckyi_boxxx
Ноя. 8, 2013 13:11:42
во-первых впервые вижу что-бы len() выдавал количество байт а не символов , но по сути если уж правда то что вы говорите то сделайте так
#!/usr/bin/python
#-*- coding: utf-8 -*-
aaa = 'some string'.decode('utf8')[3:8]
print len(aaa)
aaa.encode('utf8')
только заюзайте ваши кодировки
Jah
Ноя. 8, 2013 14:29:06
Спасибо Товарищи, вы мне очень помогли и оказались правы, дело в кодировке! Пощупал немного строки и теперь почерпнул для себя некоторые нюансы работы со строками.
Jah
Ноя. 8, 2013 14:43:06
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)