Найти - Пользователи
Полная версия: Срез строки с кириллицей.
Начало » Python для новичков » Срез строки с кириллицей.
1 2
Jah
Добрый день.

Подскажите по строкам.
Вот есть у меня строка неизвестная, допустим с кириллицей, мне нужно сделать срез и вывести 5 символов, т.к. строка unicode я делаю срез увеличив число в 2 раза, т.е. str.
Но вот встает вопрос, а что если в строке будет как кириллица, так и латинские символы, да пускай даже цифры и знаки препинания, то срез получится не верный и выведет другое количество символов.

Можно конечно формировать строку нужной длины идя по символам строки циклом, но мне кажется, что это слишком кривой вариант и есть, что-то изящнее.

Спасибо.
smoke853
Скорее всего вы работаете с 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
Jah
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'
smoke853
Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04
http://savepic.su/3735806.jpg
Jah
smoke853
Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04http://savepic.su/3735806.jpg
Действительно странно, у меня такая же система и такие же версии.
Но как оказалось, что вывод в IDLE и обычном скрипте у меня отличается. Не знаю с чем это может быть связано.
Спасибо за пример, дальше уже буду копать и разбираться.
smoke853
Jah, я думаю тут дело в кодировке. А попробуйте сделать вот так:
s = unicode('Модернизация', 'utf-8')
print len(s)
@cckyi_boxxx
во-первых впервые вижу что-бы len() выдавал количество байт а не символов , но по сути если уж правда то что вы говорите то сделайте так

#!/usr/bin/python
#-*- coding: utf-8 -*-
aaa = 'some string'.decode('utf8')[3:8]
print len(aaa)
aaa.encode('utf8')

только заюзайте ваши кодировки
Jah
Спасибо Товарищи, вы мне очень помогли и оказались правы, дело в кодировке! Пощупал немного строки и теперь почерпнул для себя некоторые нюансы работы со строками.
bismigalis
и какая была кодировка?
Jah
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)
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