2011-08-05 12 views
3

を経由して、Active Directoryから文字列をエンコードされたUnicodeでの作業、私はすでにこの問題を思い付いたが、私はいくつかのより具体的なに関する情報を使用して新しい質問を作成することを決めたいくつかのテストの後:の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) 

第1の実施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

編集:追加のrepr(複数可)に関する情報

答えて

7

まず、ので、あなたのために、printはWindowsコンソールにINGのは、多くの場合、データを文字化けステップであることを知っていますテストでは、print repr(s)に文字列の正確なバイト数を表示する必要があります。

ADのデータがどのようにエンコードされているかを調べる必要があります。再び、print repr(s)はデータの内容を見ることができます。

更新日:あなたが何らかの形で奇妙な文字列を取得しているよう

OKは、それが見えます。

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

あなたはより自然な形式でデータを取得することができるかどうかを検討することがあります:それはかなりありませんが、そこよりよいそれらを得るための方法かもしれませんが、あなたはどのような場合に適応することができます。

+0

私はUbuntuマシンでテストしています。 print repr(fullentries [23] [1])の出力はu'M \\ xc3 \\ xbcller '、印刷repr(testentry)は' M \ xc3 \ xbcller 'を出力します。編集:上記の情報を追加しました – Raptor

+0

ありがとう!あなたのアップデートは本当に機能し、あなたは私の週末を救いました;)。これは私がADから抜け出すthumbnailPhoto属性では機能しませんが、私はその回避策を見つけることができると思います。すべての純粋なテキスト文字列は今、完璧に見えます。 :) – Raptor

関連する問題