Форум сайта python.su
Есть 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
Офлайн
Проблема скорее всего в типе переменной. Такая ошибка может возникнуть если тип строки переменной не str, a unicode. Проверь это при помощи type.
type(переменная)
Офлайн
Дело в том, что Python не работает с символами у которых кода в ASCII больше 128(обратное преобразование).
Хотя при этом, всё же IDLE умудряется сохранять тексты. Будем посмотреть.
Офлайн
-=<fantom>=-Ограничение на использование ASCII касается только текстов программ на Python(в ascii должны быть имена переменных, ф-ций и т.д.). А сами строки могут быть и не в ascii(str - однобайтовые кодировки, unicode - многобайтовые).
Дело в том, что Python не работает с символами у которых кода в ASCII больше 128(обратное преобразование).
Хотя при этом, всё же IDLE умудряется сохранять тексты. Будем посмотреть.
>>>чотонарусском=2 >>>print чотонарусском 2
Офлайн
Этот код справляется с поставленной задачей:
# -*- 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)
Офлайн
Прошу прощения за долгое отсутствие. Праздники. :)
slivlen да, у строки тип unicode. Я в питоне новичёк, не подскажите как тогда бороться с кодировками?
-=<fantom>=- задача несколько другая. Есть программа которая соединяется с телефоном и возвращает список файлов в xml. А я пытаюсь на основе того что возвращает программа сделать плагин для mc. Есть подобный на перле, но к сожалению он не дружит с русским, а я не знаю перл совсем, поэтому пишу с нуля. :) Задача вобщем-то не очень сложная нужно просто парсить файл, но вот не получается. :(
Офлайн
CyxapeffА чего с ними бороться? Строка изначально в юникоде, а из него при помощи метода encode можно получить строку в любой нужной кодировке.
Прошу прощения за долгое отсутствие. Праздники. :)
slivlen да, у строки тип unicode. Я в питоне новичёк, не подскажите как тогда бороться с кодировками?
…
uni_str = u'Что-то' cp_str = uni_str.encode('cp1251') # И обратно uni_str = cp_str.decode('cp1251')
Офлайн
Всё разобрался. Спасибо. Просто в этой же строчки были ещё юникод строки которые было необходимо перекодировать. Вот она и ругалась.
Офлайн
slivlen меня обошёл по ответу. То что он написал, практически подписался сам. %)
Офлайн