通过python-ldap从Active Directory使用Unicode编码的字符串


问题内容

我已经提出了这个问题,但是经过一些测试,我决定使用一些更具体的信息来创建一个新问题:

我正在从Active Directory中使用python-ldap(和Python
2.7)读取用户帐户。这确实工作良好,但是我在使用特殊字符时遇到了问题。在控制台上打印时,它们看起来确实像UTF-8编码的字符串。目标是将它们写入MySQL
DB,但从一开始我就不会将这些字符串放入适当的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。

我在这个问题上的更老的问题是在这里:使用Python将UTF-8字符串写入MySQL

编辑:添加了代表信息


问题答案:

首先,要知道printWindows控制台通常是使数据乱码的步骤,因此对于您的测试,您应该print repr(s)查看字符串中的确切字节。

您需要找出如何编码来自AD的数据。再次,print repr(s)将让您看到数据的内容。

更新:

好的,您好像以某种方式收到了奇怪的字符串。可能有一种方法可以使它们变得更好,但是尽管效果不佳,但您可以在任何情况下进行调整:

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

您可能想研究是否可以更自然的格式获取数据。