Работа с Unicode-кодированными строками из Active Directory через python-ldap - PullRequest
3 голосов
/ 05 августа 2011

Я уже столкнулся с этой проблемой, но после некоторого тестирования я решил создать новый вопрос с более конкретной информацией:

Я читаю учетные записи пользователей с помощью python-ldap (и Python 2.7) из нашегоActive Directory.Это работает хорошо, но у меня есть проблемы со специальными символами.Они выглядят как строки в кодировке UTF-8 при печати на консоли.Цель состоит в том, чтобы записать их в базу данных MySQL, но я не получаю эти строки в надлежащем UTF-8 с самого начала.

Пример (fullentries - это мой массив со всеми записями AD):

fullentries[23][1].decode('utf-8', 'ignore')    
print fullentries[23][1].encode('utf-8', 'ignore')
print fullentries[23][1].encode('latin1', 'ignore')
print repr(fullentries[23][1])

Второй тест со строкой, вставленной вручную следующим образом:

testentry = "M\xc3\xbcller"
testentry.decode('utf-8', 'ignore')
print testentry.encode('utf-8', 'ignore')
print testentry.encode('latin1', 'ignore')
print repr(testentry)

Вывод первого примера ist:

M\xc3\xbcller
M\xc3\xbcller
u'M\\xc3\\xbcller'

Редактировать: Если я пытаюсьзамените двойную обратную косую черту на .replace ('\\\\', '\\), результат останется прежним.

Вывод второго примера:

Müller
M�ller
'M\xc3\xbcller'

Есть лиспособ получить выход AD правильно закодированы?Я уже прочитал много документации, но все это говорит о том, что LDAPv3 предоставляет вам строки в кодировке UTF-8.Active Directory использует LDAPv3.

Мой старый вопрос, тема которого здесь: Запись строки UTF-8 в MySQL с Python

Редактировать: Добавлена ​​информация о репорте

1 Ответ

8 голосов
/ 05 августа 2011

Во-первых, знайте, что print обращение к консоли Windows часто является шагом, который очищает данные, поэтому для ваших тестов вы должны print repr(s) увидеть точные байты, которые есть в вашей строке.

Вам необходимо выяснить, как кодируются данные из AD.Опять же, print repr(s) позволит вам увидеть содержимое данных.

ОБНОВЛЕНО:

ОК, похоже, вы как-то получаете странные строки.Возможно, есть способ улучшить их, но вы можете адаптироваться в любом случае, хотя это не очень красиво:

u.decode('unicode_escape').encode('iso8859-1').decode('utf8')

Возможно, вы захотите узнать, можете ли вы получить данные более естественным образом.формат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...