通过python-ldap处理来自Active Directory的Unicode编码字符串

3 投票
1 回答
13332 浏览
提问于 2025-04-16 22:58

我之前遇到过这个问题,但经过一些测试后,我决定创建一个新问题,提供一些更具体的信息:

我正在使用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)

第一个例子的输出是:

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。

我之前关于这个主题的问题在这里:用Python将UTF-8字符串写入MySQL

编辑:添加了repr(s)的信息

1 个回答

8

首先,要知道在Windows控制台上使用print输出数据时,常常会出现数据混乱的情况。所以在测试时,你应该使用print repr(s)来查看你字符串中的确切字节。

你需要弄清楚从AD获取的数据是如何编码的。同样,使用print repr(s)可以让你看到数据的内容。

更新:

好的,看起来你得到了一些奇怪的字符串。可能有更好的方法来获取这些数据,不过无论如何你都可以进行调整,尽管这样做并不好看:

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

你可能想看看是否可以以更自然的格式获取数据。

撰写回答