Форум сайта python.su
pythonwinСтрока:
покажи entry.Name
CN=Группа авторизации доступа Windows (group)
Офлайн
Все ники занятывозможно, entry.Class тоже стоит явно переводить в/из юникода?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)Вобщем, способа вывести в файл я пока не увидел…
Офлайн
bialixНет, с entry.Class нет никаких проблем при любом способе запуска - там сплошное ASCII.
возможно, entry.Class тоже стоит явно переводить в/из юникода?
Отредактировано (Июль 10, 2007 13:38:26)
Офлайн
Все ники заняты
Мне не очень понятно в чем у тебя проблема, потому что я не могу ее воспроизвести. У меня без проблем такой код все перекодирует как надо:
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') Превед! >>>
Офлайн
slivlen, мне ещё менее понятно, в чём проблема :). Могу сказать только, что проблема воспроизводится стабильно при запуске скрипта, указанного в самом первом посте этой темы, под ActivePython 2.5, WinXP SP2.
Офлайн
конкретно по вашему вопросу могу сказать следующее. проблема эта не новая и давно известная.
поток вывода sys.stdout имеет атрибут encoding, который равен кодировке консоли когда вывод идет на консоль.
Благодаря этому атрибуту все юникодные строки автоматически перекодируются в нужную кодировку.
Когда stdout перенаправляется в файл, этот атрибут имеет значение None, и используется кодек ascii, который фактически юникод не понимает.
Поэтому пользоваться чистым print – дурное занятие. Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку, либо при помощи модуля codecs сделать обвертку вокруг stdout и присвоить поток обвертку в переменную sys.stdout
Офлайн
bialixКак именно, извиняюсь за ламерство?
Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку.
Офлайн
Все ники занятыДумаю bialix хотел сказать, что и entry.Class надо перекодировать аналогично entry.Name.
Как именно, извиняюсь за ламерство?
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.
Офлайн
Все ники заняты…bialixКак именно, извиняюсь за ламерство?
Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку.
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.
Офлайн
bialix, спасибо, работает!
Офлайн