Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2006 15:19:57

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

Есть xml файл в кодировке utf8. Я его успешно парсю, затем делаю print переменная.decode(“utf-8”), на что при появлении русских букв получаю File “/usr/lib/python2.4/encodings/utf_8.py”, line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 5-11: ordinal not in range(128)
Английские естественно отображаются нормально.
Что я делаю не так?
Python 2.4.3
Zenwalk 2.8
locale utf8



Офлайн

#2 Авг. 17, 2006 21:58:59

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

Проблема скорее всего в типе переменной. Такая ошибка может возникнуть если тип строки переменной не str, a unicode. Проверь это при помощи type.

type(переменная)



Офлайн

#3 Авг. 19, 2006 07:01:18

-=<fantom>=-
От:
Зарегистрирован: 2006-08-12
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

Дело в том, что Python не работает с символами у которых кода в ASCII больше 128(обратное преобразование).
Хотя при этом, всё же IDLE умудряется сохранять тексты. Будем посмотреть.



Офлайн

#4 Авг. 19, 2006 08:30:44

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

-=<fantom>=-
Дело в том, что Python не работает с символами у которых кода в ASCII больше 128(обратное преобразование).
Хотя при этом, всё же IDLE умудряется сохранять тексты. Будем посмотреть.
Ограничение на использование ASCII касается только текстов программ на Python(в ascii должны быть имена переменных, ф-ций и т.д.). А сами строки могут быть и не в ascii(str - однобайтовые кодировки, unicode - многобайтовые).
Что касается IDLE, то там работают такие вещи:
>>>чотонарусском=2
>>>print чотонарусском
2
Код IDLE я осбо не копал, но скорее всего они обходят ограничение путем прямой модификации словарей глобальных и локальных переменных.(globals(),locals() или __main__.__dict__).



Офлайн

#5 Авг. 20, 2006 09:12:43

-=<fantom>=-
От:
Зарегистрирован: 2006-08-12
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

Этот код справляется с поставленной задачей:

# -*- coding: cp1251 -*-

from Tkinter import *

def btnPress(Event):
print ‘+++++ Begin save +++++’
a=btn.encode('cp1251')
s=open('OutText.txt','wb')
s.write(a)
s.close

root=Tk()
btn=Button(root, text=u'Текст кнопки \n ЗДЕСЯ :).')
btn.bind('<ButtonPress>', btnPress)
btn.pack()
root.mainloop()



Отредактировано (Авг. 20, 2006 09:14:29)

Офлайн

#6 Авг. 23, 2006 14:19:02

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

Прошу прощения за долгое отсутствие. Праздники. :)
slivlen да, у строки тип unicode. Я в питоне новичёк, не подскажите как тогда бороться с кодировками?
-=<fantom>=- задача несколько другая. Есть программа которая соединяется с телефоном и возвращает список файлов в xml. А я пытаюсь на основе того что возвращает программа сделать плагин для mc. Есть подобный на перле, но к сожалению он не дружит с русским, а я не знаю перл совсем, поэтому пишу с нуля. :) Задача вобщем-то не очень сложная нужно просто парсить файл, но вот не получается. :(



Офлайн

#7 Авг. 23, 2006 14:29:55

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

Cyxapeff
Прошу прощения за долгое отсутствие. Праздники. :)
slivlen да, у строки тип unicode. Я в питоне новичёк, не подскажите как тогда бороться с кодировками?
А чего с ними бороться? Строка изначально в юникоде, а из него при помощи метода encode можно получить строку в любой нужной кодировке.
Н-р вот так:
uni_str = u'Что-то'
cp_str = uni_str.encode('cp1251')
# И обратно
uni_str = cp_str.decode('cp1251')



Офлайн

#8 Авг. 23, 2006 15:05:04

Cyxapeff
От:
Зарегистрирован: 2006-08-17
Сообщения: 148
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

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



Офлайн

#9 Сен. 2, 2006 07:23:22

-=<fantom>=-
От:
Зарегистрирован: 2006-08-12
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться с кодировкой

slivlen меня обошёл по ответу. То что он написал, практически подписался сам. %)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version