Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 8, 2013 09:47:59

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

Добрый день.

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

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

Спасибо.

Офлайн

#2 Ноя. 8, 2013 10:49:43

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

Скорее всего вы работаете с 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)

Офлайн

#3 Ноя. 8, 2013 10:59:55

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

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'

Офлайн

#4 Ноя. 8, 2013 11:05:37

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04
http://savepic.su/3735806.jpg

Офлайн

#5 Ноя. 8, 2013 11:27:01

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

smoke853
Jah, хм… странно, какая версия python'a? Я проверял на 2.7.3 в ubuntu 12.04http://savepic.su/3735806.jpg
Действительно странно, у меня такая же система и такие же версии.
Но как оказалось, что вывод в IDLE и обычном скрипте у меня отличается. Не знаю с чем это может быть связано.
Спасибо за пример, дальше уже буду копать и разбираться.

Офлайн

#6 Ноя. 8, 2013 11:33:47

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

Jah, я думаю тут дело в кодировке. А попробуйте сделать вот так:

s = unicode('Модернизация', 'utf-8')
print len(s)

Офлайн

#7 Ноя. 8, 2013 13:11:42

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

во-первых впервые вижу что-бы 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)

Офлайн

#8 Ноя. 8, 2013 14:29:06

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

Спасибо Товарищи, вы мне очень помогли и оказались правы, дело в кодировке! Пощупал немного строки и теперь почерпнул для себя некоторые нюансы работы со строками.

Отредактировано Jah (Ноя. 8, 2013 14:29:48)

Офлайн

#9 Ноя. 8, 2013 14:37:42

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

Срез строки с кириллицей.

и какая была кодировка?

Офлайн

#10 Ноя. 8, 2013 14:43:06

Jah
Зарегистрирован: 2013-08-23
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Срез строки с кириллицей.

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)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version