Найти - Пользователи
Полная версия: Не могу разобраться с кодировкой
Начало » Python для экспертов » Не могу разобраться с кодировкой
1
Cyxapeff
Есть 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
slivlen
Проблема скорее всего в типе переменной. Такая ошибка может возникнуть если тип строки переменной не str, a unicode. Проверь это при помощи type.
type(переменная)
-=<fantom>=-
Дело в том, что Python не работает с символами у которых кода в ASCII больше 128(обратное преобразование).
Хотя при этом, всё же IDLE умудряется сохранять тексты. Будем посмотреть.
slivlen
-=<fantom>=-
Дело в том, что Python не работает с символами у которых кода в ASCII больше 128(обратное преобразование).
Хотя при этом, всё же IDLE умудряется сохранять тексты. Будем посмотреть.
Ограничение на использование ASCII касается только текстов программ на Python(в ascii должны быть имена переменных, ф-ций и т.д.). А сами строки могут быть и не в ascii(str - однобайтовые кодировки, unicode - многобайтовые).
Что касается IDLE, то там работают такие вещи:
>>>чотонарусском=2
>>>print чотонарусском
2
Код IDLE я осбо не копал, но скорее всего они обходят ограничение путем прямой модификации словарей глобальных и локальных переменных.(globals(),locals() или __main__.__dict__).
-=<fantom>=-
Этот код справляется с поставленной задачей:

# -*- 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()

Cyxapeff
Прошу прощения за долгое отсутствие. Праздники. :)
slivlen да, у строки тип unicode. Я в питоне новичёк, не подскажите как тогда бороться с кодировками?
-=<fantom>=- задача несколько другая. Есть программа которая соединяется с телефоном и возвращает список файлов в xml. А я пытаюсь на основе того что возвращает программа сделать плагин для mc. Есть подобный на перле, но к сожалению он не дружит с русским, а я не знаю перл совсем, поэтому пишу с нуля. :) Задача вобщем-то не очень сложная нужно просто парсить файл, но вот не получается. :(
slivlen
Cyxapeff
Прошу прощения за долгое отсутствие. Праздники. :)
slivlen да, у строки тип unicode. Я в питоне новичёк, не подскажите как тогда бороться с кодировками?
А чего с ними бороться? Строка изначально в юникоде, а из него при помощи метода encode можно получить строку в любой нужной кодировке.
Н-р вот так:
uni_str = u'Что-то'
cp_str = uni_str.encode('cp1251')
# И обратно
uni_str = cp_str.decode('cp1251')
Cyxapeff
Всё разобрался. Спасибо. Просто в этой же строчки были ещё юникод строки которые было необходимо перекодировать. Вот она и ругалась.
-=<fantom>=-
slivlen меня обошёл по ответу. То что он написал, практически подписался сам. %)
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