Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> решение ваших проблем с кодировками в Python, нуждающимся 
:(
    Опции темы
grock
Дата 18.9.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 3.8.2005
Где: Санкт - Петербург

Репутация: 1
Всего: 1



Hаболело, разобрался, набросал. Если у кого-то переодически возникают проблемы с кодировками в Python, этот пример решит ваши проблемы

Код

# -*- coding: cp1251 -*-
# (c) grock
from Tkinter import *
w = Tk()

def printw (*args)    :
            global e
            zzz = ''
            stuff = u''
            for i in args   :# перебираем аргументы, исходя из кодировки делаем следующее:
                try:# не уникод
                    zzz = unicode (i,'cp1251')
                    stuff +=  zzz
                except:# уникод
                    try:
                        stuff += i
                    except:# вообще не строка, какой-нибудь другой объект
                        stuff += unicode (str(i),'cp1251')
            print '-->', stuff                    
# ! можно даже сделать, чтобы программа все кодировки кушала !, продолжить except -ы 

            if args[len(args) - 1] != ','  : # если последний аргумент `,` не ставим перевод строки
                stuff += '\n'

            try:# например можно вставить полученную строку в контрол
            e.insert (END, stuff )
        except:
            pass

            fl = file ('test_log.txt', 'a+')
            stuff = stuff.encode ( 'cp1251' )

            if ord(stuff[0]) != 10 :
                    fl.write (': '+ stuff + '\n')
            fl.close()

try:
    printw(u'сообщение 1')
    raise IOError, 'исключение'

except Exception, err:# исключения передают ссылку на ошибку, а не саму строку!!, причем это строка должна быть не в юникоде!
                      # если вдруг она в юникоде надо делать преобразование
                      # <строка в юникоде>.encode('cp1251') -- преобразует из юникода в обычную строку
                      # в кодировке сp1251
    printw (err)
    print err

w.mainloop()




PM MAIL   Вверх
Young
Дата 24.9.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 9.9.2005

Репутация: 2
Всего: 2



Спасибо, не помогает smile
Проблема в следующем: есть модальное окно, в котором есть элемент Entry, в котором надо ограничить длину вводимой строки. Написал примерно так:
Код
Ent = Entry(root, width = 30, validate = "key", validatecommand = onKeyEntry + " %P")
onKeyEntry = root.register(onKeyEntry_registered)
def onKeyEntry_registered(val):
    if len(val) > 20 :
        return 0
    else:
        return 1
Функция onKeyEntry_registered замечательно вызывается, но если в строке val есть русские буквы, то функция len() каждую из них считает за две! Т.е. строка "ыz", введённая пользователем в элемент управления, оказывается длиной якобы в три символа (ы=2, z=1). Это просто праздник какой-то! Вызовы unicode() и encode() в функции onKeyEntry_registered бодро порождают исключения, и более ничего не делают. Как обойти? smile
PM MAIL WWW   Вверх
Young
Дата 26.9.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 9.9.2005

Репутация: 2
Всего: 2



Проверку длины строки вроде решил следующим образом (подсмотрел на другом форуме):
Код
if len(unicode(val, "UTF-8")) > 20 :
Однако, есть ещё проблема: не могу записать в файл строку, полученную из элемента управления Entry:
Код
MyStr = Ent.get().strip()
Здесь "Ent" - это элемент управления Entry. Далее пытаюсь записать эту строку в файл:
Код
file = open(FilePath, "w")
file.write(MyStr)
Получаю ошибку:
Цитата
UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-6: ordinal not in range(128)
Что надо сделать, чтобы строка записалась в файл?
PM MAIL WWW   Вверх
Young
Дата 27.9.2005, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 9.9.2005

Репутация: 2
Всего: 2



Решил проблему применением
Код
.encode("CP1251")
Вообще эти unicode-encode иногда немного запаривают мозги smile
P.S. Всем спасибо, что не мешали smile
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.