Уведомления

Группа в Telegram: @pythonsu

#1 Июль 10, 2007 12:26:31

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

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

pythonwin
покажи entry.Name
Строка:
CN=Группа авторизации доступа Windows (group)



Офлайн

#2 Июль 10, 2007 13:17:18

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  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)
Вобщем, способа вывести в файл я пока не увидел…
возможно, entry.Class тоже стоит явно переводить в/из юникода?



Офлайн

#3 Июль 10, 2007 13:37:43

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

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

bialix
возможно, entry.Class тоже стоит явно переводить в/из юникода?
Нет, с entry.Class нет никаких проблем при любом способе запуска - там сплошное ASCII.



Отредактировано (Июль 10, 2007 13:38:26)

Офлайн

#4 Июль 10, 2007 14:45:51

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

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

Все ники заняты
Мне не очень понятно в чем у тебя проблема, потому что я не могу ее воспроизвести. У меня без проблем такой код все перекодирует как надо:

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()
&#9575;Ёхтхф!
>>> print open('c:\\preved.txt', 'r').read().decode('cp1251')
Превед!
>>>



Офлайн

#5 Июль 10, 2007 17:24:22

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

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

slivlen, мне ещё менее понятно, в чём проблема :). Могу сказать только, что проблема воспроизводится стабильно при запуске скрипта, указанного в самом первом посте этой темы, под ActivePython 2.5, WinXP SP2.



Офлайн

#6 Июль 10, 2007 23:35:24

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

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

конкретно по вашему вопросу могу сказать следующее. проблема эта не новая и давно известная.
поток вывода sys.stdout имеет атрибут encoding, который равен кодировке консоли когда вывод идет на консоль.
Благодаря этому атрибуту все юникодные строки автоматически перекодируются в нужную кодировку.

Когда stdout перенаправляется в файл, этот атрибут имеет значение None, и используется кодек ascii, который фактически юникод не понимает.

Поэтому пользоваться чистым print – дурное занятие. Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку, либо при помощи модуля codecs сделать обвертку вокруг stdout и присвоить поток обвертку в переменную sys.stdout



Офлайн

#7 Июль 12, 2007 22:45:55

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

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

bialix
Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку.
Как именно, извиняюсь за ламерство?
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.



Офлайн

#8 Июль 12, 2007 23:38:38

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

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

Все ники заняты
Как именно, извиняюсь за ламерство?
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.
Думаю bialix хотел сказать, что и entry.Class надо перекодировать аналогично entry.Name.



Офлайн

#9 Июль 13, 2007 08:29:21

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

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

Все ники заняты
bialix
Перед тем как выводить что-то на печать нужно преобразовать *всю* выводимую строку из юникода в некоторую кодировку.
Как именно, извиняюсь за ламерство?
Буду благодарен, если поправите скрипт, расположенный в самом первом посте.

for entry in adsi:
u = ‘ ’ * level + entry.Name + ‘ (’ + entry.Class + ‘)’
print u.encode('cp1251')



Офлайн

#10 Июль 13, 2007 08:55:38

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

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

bialix, спасибо, работает!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version