我已经想出了这个问题,但经过一些测试后我决定用一些更具体的信息创建一个新问题:
我正在使用我们的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
答案 0 :(得分:8)
首先,要知道print
到Windows控制台通常是使数据乱码的步骤,因此对于测试,您应该print repr(s)
查看字符串中的精确字节。
您需要了解AD中的数据是如何编码的。同样,print repr(s)
会让您看到数据的内容。
更新:
好吧,看起来你会以某种方式得到奇怪的字符串。可能有一种方法可以让它们变得更好,但是你可以适应任何情况,尽管它并不漂亮:
u.decode('unicode_escape').encode('iso8859-1').decode('utf8')
您可能希望了解是否可以采用更自然的格式获取数据。