通过python-ldap使用Active Directory中的unicode编码字符串

时间:2011-08-05 13:09:55

标签: python unicode utf-8 active-directory

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

我正在使用我们的Active Directory中的python-ldap(和Python 2.7)读取用户帐户。这确实很好用,但我有特殊字符的问题。在控制台上打印时,它们看起来像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。

我的老问题这个主题在这里:Writing UTF-8 String to MySQL with Python

编辑:添加了repr(s)infos

1 个答案:

答案 0 :(得分:8)

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

您需要了解AD中的数据是如何编码的。同样,print repr(s)会让您看到数据的内容。

更新:

好吧,看起来你会以某种方式得到奇怪的字符串。可能有一种方法可以让它们变得更好,但是你可以适应任何情况,尽管它并不漂亮:

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

您可能希望了解是否可以采用更自然的格式获取数据。