Все ники заняты
Июль 10, 2007 12:26:31
pythonwin
покажи entry.Name
Строка:
CN=Группа авторизации доступа Windows (group)
bialix
Июль 10, 2007 13:17:18
Все ники заняты
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)
Вобщем, способа вывести в файл я пока не увидел…
возможно, entry.Class тоже стоит явно переводить в/из юникода?
Все ники заняты
Июль 10, 2007 13:37:43
bialix
возможно, entry.Class тоже стоит явно переводить в/из юникода?
Нет, с entry.Class нет никаких проблем при любом способе запуска - там сплошное ASCII.
slivlen
Июль 10, 2007 14:45:51
Все ники занятыМне не очень понятно в чем у тебя проблема, потому что я не могу ее воспроизвести. У меня без проблем такой код все перекодирует как надо:
Python 2.4.3 (#69, Mar 29 2006, 17:35:34) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> str_cp866 = raw_input()
Превед!
>>> str_cp866
'\x8f\xe0\xa5\xa2\xa5\xa4!'
>>> uni_str = unicode(str_cp866, 'cp866')
>>> uni_str
u'\u041f\u0440\u0435\u0432\u0435\u0434!'
>>> open('c:\\preved.txt', 'w').write(uni_str.encode('cp1251'))
>>> open('c:\\preved.txt', 'r').read()
'\xcf\xf0\xe5\xe2\xe5\xe4!'
>>> print open('c:\\preved.txt', 'r').read()
╧Ёхтхф!
>>> print open('c:\\preved.txt', 'r').read().decode('cp1251')
Превед!
>>>
Все ники заняты
Июль 10, 2007 17:24:22
slivlen, мне ещё менее понятно, в чём проблема :). Могу сказать только, что проблема воспроизводится стабильно при запуске скрипта, указанного в самом первом посте этой темы, под ActivePython 2.5, WinXP SP2.
bialix
Июль 10, 2007 23:35:24
конкретно по вашему вопросу могу сказать следующее. проблема эта не новая и давно известная.
поток вывода sys.stdout имеет атрибут encoding, который равен кодировке консоли когда вывод идет на консоль.
Благодаря этому атрибуту все юникодные строки автоматически перекодируются в нужную кодировку.
Когда stdout перенаправляется в файл, этот атрибут имеет значение None, и используется кодек ascii, который фактически юникод не понимает.
Поэтому пользоваться чистым print – дурное занятие. Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку, либо при помощи модуля codecs сделать обвертку вокруг stdout и присвоить поток обвертку в переменную sys.stdout
Все ники заняты
Июль 12, 2007 22:45:55
bialix
Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку.
Как именно, извиняюсь за ламерство?
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.
slivlen
Июль 12, 2007 23:38:38
Все ники заняты
Как именно, извиняюсь за ламерство?
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.
Думаю
bialix хотел сказать, что и entry.Class надо перекодировать аналогично entry.Name.
bialix
Июль 13, 2007 08:29:21
Все ники заняты
bialix
Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку.
Как именно, извиняюсь за ламерство?
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.
…
for entry in adsi:
u = ‘ ’ * level + entry.Name + ‘ (’ + entry.Class + ‘)’
print u.encode('cp1251')
…
Все ники заняты
Июль 13, 2007 08:55:38
bialix, спасибо, работает!