Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Июль 6, 2007 08:57:48

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

ActivePython 2.5, WinXP SP2.

# -*- coding: cp1251 -*-
import win32com.client

def structLDAP(startingPoint, level):
adsi = win32com.client.GetObject("LDAP://" + startingPoint)
for entry in adsi:
print ' ' * level + entry.Name + ' (' + entry.Class + ')'
structLDAP(startingPoint + '/' + entry.Name.replace('/', '\\/'), level + 1)

startingPoint = "DC=ru/DC=domainName"
structLDAP(startingPoint, 0)
Инструкция “print” правильно отрабатывает при выводе на консоль cmd.exe, но отказывается работать при перенаправлении вывода в файл:
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 5-10: ordinal not in range(128)
Пробовал unicode, encode, decode в разных комбинациях - не могу найти правильное сочетание.
P.S. Может, найдутся энтузиасты написать статью, полностью освещающую все случаи борьбы с кодировками?



Офлайн

#2 Июль 6, 2007 10:33:34

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

Все ники заняты
P.S. Может, найдутся энтузиасты написать статью, полностью освещающую все случаи борьбы с кодировками?
всё уже украдено до нас
http://boodebr.org/main/python/all-about-python-and-unicode



Офлайн

#3 Июль 6, 2007 10:46:41

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

Если нужен файл с досовской кодировкой (допустим для печати из far), то пишем так - “out_file.write(text.encode(”cp866“))”.
Если нужен файл под винду, то пишем - “out_file.write(text.encode(”cp1251“))”.
Если данные, записываемые в файл, взяты из формы, то в некоторых случаях приходится писать так - “out_file.write(text.decode(”cp1251“).encode(”cp866“))”.
Если твой текст состоит еще из цифр и символов, то приходится разбивать текст на части. Часть из текста перекодировать в нужную кодировку, а часть из символов и цифр оставить как есть.
Это все из моей практики, может поможет.



Офлайн

#4 Июль 6, 2007 12:08:29

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

Все ники заняты
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 5-10: ordinal not in range(128)
Пробовал unicode, encode, decode в разных комбинациях - не могу найти правильное сочетание.
P.S. Может, найдутся энтузиасты написать статью, полностью освещающую все случаи борьбы с кодировками?
Судя по обилию вопросов на тему кодировок – пора уже что-то написать.



Офлайн

#5 Июль 6, 2007 13:47:39

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

proDiva, спасибо, но меня это не спасает. Попытка применить entry.Name.encode('чего-то там') приводит к такой же ошибке, а запись в файл меня не устраивает - мне нужен скрипт, который работает как “интерактивно”, так и перенаправляет вывод в файл (т.е. всё должно работать с инструкцией print).
Проблема в содержимом переменной entry.Name, которое непредсказуемо (это содержимое возвращает LDAP-сервер). Пожалуйста, напишите код, который будет правильно “разбивать текст на части”, если это необходимо.



Офлайн

#6 Июль 8, 2007 17:48:47

Cleric
От:
Зарегистрирован: 2007-06-26
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

Возможно не в тему, для чтения/записи файлов в опр. кодировке лучше пользоваться codecs.open, а не магическими заклинаниями encode decode, применяемыми перед операциями с файлом.



Офлайн

#7 Июль 10, 2007 08:59:09

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

lorien
Попробуйте так: print type(enty.Name), если будет выводиться <type ‘str’>, значит GetObject возвращает не unicode.
Выводит <type ‘unicode’>
print '  ' * level + entry.Name.decode('cp1251') + ' (' + entry.Class + ')'
выдает ошибку при любом способе запуска:
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 3-8: ordinal not in range(128)
Вобщем, способа вывести в файл я пока не увидел…



Офлайн

#8 Июль 10, 2007 09:47:51

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

И опять кодировки :( Невозможно вывести русский текст в файл...

Все ники заняты
У тебя строка уже в юникоде, поэтому чтобы из нее получить строку в cp1251 надо использовать метод encode:

print '  ' * level + entry.Name.encode('cp1251') + ' (' + entry.Class + ')'



Офлайн

#9 Июль 10, 2007 11:45:57

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

И опять кодировки :( Невозможно вывести русский текст в файл...

slivlen
У тебя строка уже в юникоде, поэтому чтобы из нее получить строку в cp1251 надо использовать метод encode
Всё равно не работает при любом способе запуска:
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xc3 in position 5: ordinal not in range(128)



Отредактировано (Июль 10, 2007 11:47:17)

Офлайн

#10 Июль 10, 2007 11:56:59

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

И опять кодировки :( Невозможно вывести русский текст в файл...

покажи entry.Name



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version