Найти - Пользователи
Полная версия: Еще немного про Utf-8
Начало » Python для новичков » Еще немного про Utf-8
1
Enchantner
Странная вещь. В коде у меня сравниваются значения юникодовых строк, между которыми приходится вручную вставлять пробел. Выглядит это примерно так:
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)
То есть энкодер почему-то не понимает вставленный мной пробел. Как грамотно исправить положение?
Lolka
А какая локаль в шелле, откуда запускаете?
Enchantner
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=
Андрей Светлов
Сравните os.environ и найдите разницу.
Питон в вас, дайте догадаюсь, 2.6.
Зачем вам требуется упорно кастовать item и item к строке, чтобы следующим шагом сделать на конкатенации юникод?
Модификация списка ‘inplace’, которая items_list.pop - очень плохая идея.
Enchantner
Андрей Светлов
Догадались. В os.environ то же самое. В item и item могут быть русские буквы и некоторые сторонние символы (это русский текст, выковыренный парсером из XML-файла, у него кодировка тоже utf-8). Приведение в момент создания списка выдает ошибку юникода, а если не приводить:
cur_name = item + u“\xa0” + item
TypeError: coercing to Unicode: need string or buffer, NoneType found
хотя оба item не пустые. Не понимаю.
pasaranax
Enchantner
cur_name = item + u“\xa0” + item
TypeError: coercing to Unicode: need string or buffer, NoneType found
вот эту ошибку выдает и в эклипсе и в терминале? может ошибка где-то раньше закралась?
Enchantner
pasaranax
да вроде нет, простая юникодная строка… да, ошибка и там и там
Андрей Светлов
С каких, интересно, пор None стал юникодной строкой?
Да и str, которые вы пытаетесь использовать - тоже не юникод, конечно. Почему бы не заменить на cur_name = unicode(item) + u“\xa0” + unicode(item) ?
Конечно, если вас совсем не беспокоит, что может быть строка u'None\xa0None'.

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

Эээх. Годы проходят, а вопросы по использованию non-ascii кодировок не меняются :(
sypper-pit
А чем тебя такое решение пугает ?

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)
Андрей Светлов
Люблю 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.
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