質問

私はXMLRPCの上に私のクライアントのいずれかから取得した文字列の問題を持っています。彼は私がPythonでそれらを取得するときに私は1つのより多くの時間をデコードする必要があるUnicodeオブジェクトを持っている:(私に二回エンコードされているUTF8文字列を送信しますが、明らかにPythonがそれを許可していません。私は、私は必要しかし、私のクライアントを気づきました今の迅速な回避策を行うために、彼はそれを修正する前に。

TCPダンプからの生の文字列ます:

<string>Rafa\xc3\x85\xc2\x82</string>

これはに変換されます:

u'Rafa\xc5\x82'

私たちが得る最高のは、次のとおりです。

eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8") 

これはある正しい文字列になります:

u'Rafa\u0142' 

これは地獄のように醜いですし、生産コードで使用することはできませんが動作します。 誰もが、より適切な方法でこの問題を解決する方法を知っている場合は記入してください。 おかげで、 クリス

役に立ちましたか?

解決

>>> s = u'Rafa\xc5\x82'
>>> s.encode('raw_unicode_escape').decode('utf-8')
u'Rafa\u0142'
>>>

他のヒント

YOW、それは楽しかった!

>>> original = "Rafa\xc3\x85\xc2\x82"
>>> first_decode = original.decode('utf-8')
>>> as_chars = ''.join([chr(ord(x)) for x in first_decode])
>>> result = as_chars.decode('utf-8')
>>> result
u'Rafa\u0142'

ですから、それぞれの文字が実際にUTF-8バイトの値であるUnicode文字列を取得し、第1デコードを行います。あなたはその後、通常通りデコード本物のUTF-8文字列に戻って取得するためにこれらの文字のそれぞれの整数値を経由して行きます。

>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>

latin1のは、リッチーのnuts'n'bolts方法のためだけの略語です。

真剣に下に説明raw_unicode_escapeコーデックは、このケースでlatin1と同じ結果を与えることは非常に好奇心です。彼らは常に同じ結果を与えるのですか?もしそうなら、なぜ、このようなコーデックを持っていますか?そうでない場合、それはOPのクライアントが'Rafa\xc5\x82'するu'Rafa\xc5\x82'からの変換を行なったし、そのプロセスを逆にする正確にどのように確実に知ることが好ましいが正確だろう - ダブルエンコーディングが固定される前に、別のデータがアップ作物場合はそうでない場合は、我々は剥がれてくるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top