24

xmlrpcを介してクライアントの1つから取得する文字列に問題があります。彼は2回エンコードされたutf8文字列を送ってくれます:(Pythonでそれらを取得すると、もう一度デコードする必要のあるUnicodeオブジェクトがありますが、明らかに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' 

ただし、これは地獄のように醜く機能し、本番コードでは使用できません。誰かがこの問題をより適切な方法で修正する方法を知っているなら、書いてください。ありがとう、クリス

4

3 に答える 3

46
>>> s = u'Rafa \ xc5 \ x82'
>>> s.encode('raw_unicode_escape')。decode('utf-8')
u'ラファ\u0142'
>>>
于 2009-07-24T13:11:26.970 に答える
4

やー、楽しかった!

>>> 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 文字列を取得します。これらの各文字の整数値を経由して、本物の UTF-8 文字列に戻り、それを通常どおりデコードします。

于 2009-07-24T13:15:27.620 に答える
2
>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>

latin1 は Richie の nuts'n'bolts method の単なる省略形です。

非常に説明が不十分なコーデックが、この場合raw_unicode_escapeと同じ結果をもたらすことは非常に興味深いことです。latin1それらは常に同じ結果をもたらしますか? もしそうなら、なぜそのようなコーデックを持っているのですか? 'Rafa\xc5\x82'そうでない場合は、OP のクライアントが からへの変換をu'Rafa\xc5\x82'行い、そのプロセスを正確に逆にする方法を正確に知ることが望ましいでしょう。

于 2009-07-24T14:31:52.603 に答える