通过python-ldap处理来自Active Directory的Unicode编码字符串
我之前遇到过这个问题,但经过一些测试后,我决定创建一个新问题,提供一些更具体的信息:
我正在使用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')
你可能想看看是否可以以更自然的格式获取数据。