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

3
我已经遇到了这个问题,但在进行一些测试后,我决定提出一个新问题,并提供更多具体信息:
我正在使用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 repr(s) 命令来查看字符串中确切的字节。

你需要找出 AD 中的数据是如何编码的。同样地,print repr(s) 会让你看到数据的内容。

更新:

好的,看起来你得到了一些奇怪的字符串。可能有一种更好的方法可以得到更好的结果,但是你可以在任何情况下进行调整,尽管这并不美观:

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

你可能需要考虑是否可以获取更自然的数据格式。

我正在一台Ubuntu机器上进行测试,仅供记录。print repr(fullentries[23][1])的输出为u'M\xc3\xbcller',print repr(testentry)的输出为'M\xc3\xbcller'。编辑:添加了上述信息。 - Raptor
谢谢!您的更新确实有效,您拯救了我的周末;)。这不能与我从AD中获取的thumbnailPhoto属性一起使用,但我认为我们可以找到一个解决方法。所有纯文本字符串现在看起来都很完美。 :) - Raptor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接