Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 4, 2009 11:28:50

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще немного про Utf-8

Странная вещь. В коде у меня сравниваются значения юникодовых строк, между которыми приходится вручную вставлять пробел. Выглядит это примерно так:

def popItem(item_name, items_list):
for i, item in enumerate(items_list):
cur_name = str(item[1]) + u"\xa0" + str(item[2])
if item_name == cur_name:
items_list.pop(i)
Прикол в том, что в Eclipse, где я пишу и отлаживаю проект, все почему-то работает на ура. Но стоит только запустить тот же файл через bash:
File “/home/meow-nofer/workspace/pyGrabber/src/test.py”, line 189, in popItem
cur_name = str(item) + u“\xa0” + str(item)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 14-16: ordinal not in range(128)
То есть энкодер почему-то не понимает вставленный мной пробел. Как грамотно исправить положение?



Отредактировано (Окт. 4, 2009 11:39:19)

Офлайн

#2 Окт. 4, 2009 12:08:21

Lolka
От:
Зарегистрирован: 2007-09-29
Сообщения: 128
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще немного про Utf-8

А какая локаль в шелле, откуда запускаете?



Офлайн

#3 Окт. 4, 2009 12:17:54

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще немного про Utf-8

Lolka

LANG=ru_RU.UTF-8
LC_CTYPE=“ru_RU.UTF-8”
LC_NUMERIC=“ru_RU.UTF-8”
LC_TIME=“ru_RU.UTF-8”
LC_COLLATE=“ru_RU.UTF-8”
LC_MONETARY=“ru_RU.UTF-8”
LC_MESSAGES=“ru_RU.UTF-8”
LC_PAPER=“ru_RU.UTF-8”
LC_NAME=“ru_RU.UTF-8”
LC_ADDRESS=“ru_RU.UTF-8”
LC_TELEPHONE=“ru_RU.UTF-8”
LC_MEASUREMENT=“ru_RU.UTF-8”
LC_IDENTIFICATION=“ru_RU.UTF-8”
LC_ALL=



Офлайн

#4 Окт. 4, 2009 12:42:52

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Еще немного про Utf-8

Сравните os.environ и найдите разницу.
Питон в вас, дайте догадаюсь, 2.6.
Зачем вам требуется упорно кастовать item и item к строке, чтобы следующим шагом сделать на конкатенации юникод?
Модификация списка ‘inplace’, которая items_list.pop - очень плохая идея.



Офлайн

#5 Окт. 4, 2009 13:24:13

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще немного про Utf-8

Андрей Светлов
Догадались. В os.environ то же самое. В item и item могут быть русские буквы и некоторые сторонние символы (это русский текст, выковыренный парсером из XML-файла, у него кодировка тоже utf-8). Приведение в момент создания списка выдает ошибку юникода, а если не приводить:

cur_name = item + u“\xa0” + item
TypeError: coercing to Unicode: need string or buffer, NoneType found
хотя оба item не пустые. Не понимаю.



Отредактировано (Окт. 4, 2009 13:26:29)

Офлайн

#6 Окт. 4, 2009 13:41:27

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще немного про Utf-8

Enchantner
cur_name = item + u“\xa0” + item
TypeError: coercing to Unicode: need string or buffer, NoneType found
вот эту ошибку выдает и в эклипсе и в терминале? может ошибка где-то раньше закралась?



Офлайн

#7 Окт. 4, 2009 14:10:32

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Еще немного про Utf-8

pasaranax
да вроде нет, простая юникодная строка… да, ошибка и там и там



Офлайн

#8 Окт. 4, 2009 17:34:01

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Еще немного про Utf-8

С каких, интересно, пор None стал юникодной строкой?
Да и str, которые вы пытаетесь использовать - тоже не юникод, конечно. Почему бы не заменить на cur_name = unicode(item) + u“\xa0” + unicode(item) ?
Конечно, если вас совсем не беспокоит, что может быть строка u'None\xa0None'.

Общее правило: работайте только с unicode, преобразуйте к строке только перед записью.

Эээх. Годы проходят, а вопросы по использованию non-ascii кодировок не меняются :(



Офлайн

#9 Окт. 6, 2009 17:37:04

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Еще немного про Utf-8

А чем тебя такое решение пугает ?

def popItem(item_name, items_list):
for i, item in enumerate(items_list):
cur_name = str(item[1]) + """ """ + str(item[2])
if item_name == cur_name:
items_list.pop(i)

Офлайн

#10 Окт. 7, 2009 01:40:59

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Еще немного про Utf-8

Люблю immutable типы, по крайней мере для простых значений.

def popItem(item_name, items_tuple):
return tuple(i for i in items_tuple if str(i[1]) + """ """ + str(i[2]) != curr_name)
Так мне понятней, запись часто короче и, главное, нет side-effects.



Отредактировано (Окт. 7, 2009 01:41:56)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version