2017-01-19 24 views
0

私はひどくフォーマットされた文字列データベースのデータベースを持っています。データは次のようになります。二重にエスケープされたユニコード文字列を扱う

"street"=>"\"\\u4e2d\\u534e\\u8def\"" 

それはこのようにする必要がありますとき:

"street"=>"中华路" 

私が持っている問題は、二重にエスケープ文字列がデータベースから来るとき、彼らは中国にデコードされていないということです彼らはそうすべきである。私はこの変数を持っているとします。 street="\"\\u4e2d\\u534e\\u8def\""と私はprint(street)結果は、私が実際のUnicode文字に"\u4e2d\u534e\u8def"を変換するには、この時点で何ができるのコードポイント"\u4e2d\u534e\u8def"

の文字列であることを印刷する場合は?

+0

彼らはどのようにそこに行ったのですか?以下の答えは、それらがPythonの文字列リテラル(例えば 'repr'のもの)であると仮定しているようですが、JSON文字列(' json.loads'を使う)や '\ u'エスケープ潜在的に異なるエッジケースを有する。間違ったフォーマットを選択すると、より多くのマングリングが発生する可能性があります。 – bobince

答えて

5

この文字列を、その後、あなたのため\\を処理するunicode-escapeでそれをデコード:次に、各文字列のために、あなたはchrint、バック文字列にそれを変換することができ

>>> line = "\"\\u4e2d\\u534e\\u8def\"" 
>>> line.encode('utf8').decode('unicode-escape') 
'"中华路"' 

+0

'eval(" \ "\\ u4e2d \\ u534e \\ u8def \" ")は' '中華路 ''です。 –

+0

@TerryJanReedyあなたは絶対に正しいです。私はPython-2を考えているに違いないが、今は 'python-3.5'タグを見ている。この解決策は、Python 2または3のいずれかで動作するはずです(しかし、OPが特に要求していない場合) – bunji

3

'\\u'には、stripsplitの二重引用符を削除できます。これにより、16進数を表す文字列としての文字が得られます。 utf8として最初にエンコードし

>>> street = "\"\\u4e2d\\u534e\\u8def\"" 
>>> ''.join(chr(int(x, 16)) for x in street.strip('"').split('\\u') if x) 
'中华路' 
+0

eval関数を使うだけです: 'eval(" \ "\\ u4e2d \\ u534e \\ u8def \" ")は' '中華路 ''です。 –

2

あなたが書き込んだ内容に基づいて、データベースには評価可能なascii repr非Unicode文字を含む文字列の黙示

>>> eval("\"\\u4e2d\\u534e\\u8def\"") 
'中华路' 

Pythonには、このための組み込み関数があります。

>>> ascii('中华路') 
"'\\u4e2d\\u534e\\u8def'" 

唯一の違いは、必要に応じて内部引用のための\"代わりに'の使用です。

関連する問題