Найти - Пользователи
Полная версия: И опять кодировки :( Невозможно вывести русский текст в файл...
Начало » Python для новичков » И опять кодировки :( Невозможно вывести русский текст в файл...
1 2 3
Все ники заняты
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. Может, найдутся энтузиасты написать статью, полностью освещающую все случаи борьбы с кодировками?
Александр Кошелев
Все ники заняты
P.S. Может, найдутся энтузиасты написать статью, полностью освещающую все случаи борьбы с кодировками?
всё уже украдено до нас
http://boodebr.org/main/python/all-about-python-and-unicode
proDiva
Если нужен файл с досовской кодировкой (допустим для печати из far), то пишем так - “out_file.write(text.encode(”cp866“))”.
Если нужен файл под винду, то пишем - “out_file.write(text.encode(”cp1251“))”.
Если данные, записываемые в файл, взяты из формы, то в некоторых случаях приходится писать так - “out_file.write(text.decode(”cp1251“).encode(”cp866“))”.
Если твой текст состоит еще из цифр и символов, то приходится разбивать текст на части. Часть из текста перекодировать в нужную кодировку, а часть из символов и цифр оставить как есть.
Это все из моей практики, может поможет.
bialix
Все ники заняты
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 5-10: ordinal not in range(128)
Пробовал unicode, encode, decode в разных комбинациях - не могу найти правильное сочетание.
P.S. Может, найдутся энтузиасты написать статью, полностью освещающую все случаи борьбы с кодировками?
Судя по обилию вопросов на тему кодировок – пора уже что-то написать.
Все ники заняты
proDiva, спасибо, но меня это не спасает. Попытка применить entry.Name.encode('чего-то там') приводит к такой же ошибке, а запись в файл меня не устраивает - мне нужен скрипт, который работает как “интерактивно”, так и перенаправляет вывод в файл (т.е. всё должно работать с инструкцией print).
Проблема в содержимом переменной entry.Name, которое непредсказуемо (это содержимое возвращает LDAP-сервер). Пожалуйста, напишите код, который будет правильно “разбивать текст на части”, если это необходимо.
Cleric
Возможно не в тему, для чтения/записи файлов в опр. кодировке лучше пользоваться codecs.open, а не магическими заклинаниями encode decode, применяемыми перед операциями с файлом.
Все ники заняты
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)
Вобщем, способа вывести в файл я пока не увидел…
slivlen
Все ники заняты
У тебя строка уже в юникоде, поэтому чтобы из нее получить строку в cp1251 надо использовать метод encode:
print '  ' * level + entry.Name.encode('cp1251') + ' (' + entry.Class + ')'
Все ники заняты
slivlen
У тебя строка уже в юникоде, поэтому чтобы из нее получить строку в cp1251 надо использовать метод encode
Всё равно не работает при любом способе запуска:
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xc3 in position 5: ordinal not in range(128)
pythonwin
покажи entry.Name
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