Форум сайта python.su
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)
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 5-10: ordinal not in range(128)Пробовал unicode, encode, decode в разных комбинациях - не могу найти правильное сочетание.
Офлайн
Все ники занятывсё уже украдено до нас
P.S. Может, найдутся энтузиасты написать статью, полностью освещающую все случаи борьбы с кодировками?
Офлайн
Если нужен файл с досовской кодировкой (допустим для печати из far), то пишем так - “out_file.write(text.encode(”cp866“))”.
Если нужен файл под винду, то пишем - “out_file.write(text.encode(”cp1251“))”.
Если данные, записываемые в файл, взяты из формы, то в некоторых случаях приходится писать так - “out_file.write(text.decode(”cp1251“).encode(”cp866“))”.
Если твой текст состоит еще из цифр и символов, то приходится разбивать текст на части. Часть из текста перекодировать в нужную кодировку, а часть из символов и цифр оставить как есть.
Это все из моей практики, может поможет.
Офлайн
Все ники занятыСудя по обилию вопросов на тему кодировок – пора уже что-то написать.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-сервер). Пожалуйста, напишите код, который будет правильно “разбивать текст на части”, если это необходимо.
Офлайн
Возможно не в тему, для чтения/записи файлов в опр. кодировке лучше пользоваться codecs.open, а не магическими заклинаниями encode decode, применяемыми перед операциями с файлом.
Офлайн
lorienВыводит <type ‘unicode’>
Попробуйте так: print type(enty.Name), если будет выводиться <type ‘str’>, значит GetObject возвращает не 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)Вобщем, способа вывести в файл я пока не увидел…
Офлайн
Все ники заняты
У тебя строка уже в юникоде, поэтому чтобы из нее получить строку в 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)
Отредактировано (Июль 10, 2007 11:47:17)
Офлайн
покажи entry.Name
Офлайн