【问题标题】:Working with unicode encoded Strings from Active Directory via python-ldap通过 python-ldap 处理来自 Active Directory 的 unicode 编码字符串
【发布时间】:2011-08-05 13:09:55
【问题描述】:

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

我正在从我们的 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)

第一个例子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。

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

编辑:添加代表信息

【问题讨论】:

    标签: python unicode utf-8 active-directory


    【解决方案1】:

    首先,要知道 print 到 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' 编辑:添加了上面的信息
    • 谢谢!你的更新确实有效,你救了我的周末;)。这不适用于我从 AD 中获得的 thumbnailPhoto 属性,但我认为我们可以找到解决方法。所有纯文本字符串现在看起来都很完美。 :)
    猜你喜欢
    • 2014-12-05
    • 2015-09-11
    • 2011-08-11
    • 2014-12-12
    • 2013-01-26
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多