2011-08-05 112 views
3

我已经与这个问题提出了采用Unicode编码字符串的处理,但一些测试后,我决定创造一些更具体的相关信息了一个新问题:与从Active Directory通过Python-LDAP

我读使用者帐户python-ldap(和Python 2.7)来自我们的Active Directory。这确实很好,但我在特殊字符方面遇到问题。打印在控制台上时,它们看起来像UTF-8编码的字符串。目标是将它们写入MySQL DB,但我从一开始就没有将这些字符串转换为正确的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( '\\\\','\\)的OUTP更换双反斜线ut仍然是一样的。

第二个例子的输出:

Müller 
M�ller 
'M\xc3\xbcller' 

有没有什么办法让AD输出正确编码?我已经阅读了很多文档,但是它都指出LDAPv3严格地为您提供了UTF-8编码的字符串。 Active Directory使用LDAPv3。

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

编辑:新增再版(S)的相关信息

回答

7

首先,知道print荷兰国际集团到Windows控制台往往是garbles数据,所以步骤您测试,你应该print repr(s)看到你的字符串中的确切字节。

您需要了解AD的数据是如何编码的。再次,print repr(s)将让您看到数据的内容。

已更新:

好吧,它看起来像你越来越奇怪的字符串。有可能是一种方式,以更好地让他们,但你可以在任何情况下适应,虽然它不是漂亮:

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

你可能想看看你是否能得到更自然的格式的数据。

+0

我在Ubuntu机器上进行测试,仅供参考。印刷品repr(fullentries [23] [1])的输出是u'M \\ xc3 \\ xbcller',对于印刷品repr(testentry),它打印'M \ xc3 \ xbcller'编辑:添加了以上信息 – Raptor

+0

谢谢!你的更新确实有效,你救了我的周末;)。这不适用于我退出AD的thumbnailPhoto属性,但我认为我们可以找到解决方法。所有纯文本字符串现在看起来完美。 :) – Raptor