2016-07-12 9 views
3

私はいくつかのコードをpython2からpython3に変換しています。 python2でstring.decode( 'utf8')をpython2からpython3に変換する

、私は次のことを行うことができます。

>>> c = '\xe5\xb8\x90\xe6\x88\xb7' 
>>> print c 
帐户 
>>> c.decode('utf8') 
u'\u5e10\u6237' 

にはどうすればいいのpython3で、同じ出力(U '\ u5e10 \ u6237')を得ることができますか?


編集

は、この問題を持つ他の誰のために、私は、各文字が個々の要素として扱われる必要がある結果を利用する反応を見た後に実現しました。 '¥u5e10¥u6237'のようなエスケープされたユニコード表現は文字列なので、元の中国語文字に対応する部分に自然に分割されません。

>>> c = '帐户' 
>>> type(c.encode('unicode-escape').decode('ascii')) 
<class 'str'> 
>>> [l for l in c.encode('unicode-escape').decode('ascii')] 
['\\', 'u', '5', 'e', '1', '0', '\\', 'u', '6', '2', '3', '7'] 

あなたは、入力文字列内の各文字を分離して、あなたのプログラムの次の部分で再びそれを解析する場合を除き、配列に別々にそれを翻訳する必要があります。私のソリューションは、このようにした

>>> [l.encode('unicode-escape').decode('ascii') for l in c] 
['\\u5e10', '\\u6237'] 

代替ソリューションは、16進数表現に各文字を作る:助けを

>>> [hex(ord(l)) for l in c] 
['0x5e10', '0x6237'] 

感謝を。

答えて

3

これは「ユニコードエスケープ」エンコーディングと呼ばれます。ここでは1がのpython3でこの動作を実現する方法の例です:

In [11]: c = b'\xe5\xb8\x90\xe6\x88\xb7' 

In [12]: d = c.decode('utf8') 

In [13]: print(d) 
帐户 

In [14]: print(d.encode('unicode-escape').decode('ascii')) 
\u5e10\u6237 

あなたがbytesなくstrとしてそれをしたい場合、あなたは、単に.decode('ascii')を取り除くことができます。

1

python2と同じunicodeを返すことはできません。python2のように、unicodeオブジェクトはPython3で見たことがありません。しかし、ユニコードオブジェクトの値を取得することは可能です。

これを行うには、いくつかのことを実行する必要があります。
- 値のバイト要素を作成します。「\ xe5 \ xb8 \ X90 \ XE6 \ X88 \ xb7」 - 文字列 にこのバイト要素を変換 - 取得します文字列からのユニコードコード

最初の手順はとても簡単です。 、あなたのCと同じ値のバイト要素「C」を作成するだけで実行します。

c = b'\xe5\xb8\x90\xe6\x88\xb7' 

を次に、要素を読み取るために

c_string = c.decode() # default encoding is utf-8 

は最後に、私はに文字列を変換する機能を作成しましたそれが最も可能性の高い非効率的であるものの、その文字+ユニコード表現

def get_unicode_code(text): 
    result = "" 
    for char in text: 
     ord_value = ord(char) 
     if ord_value < 128: 
      result += char 
     else: 
      hex_string = format(ord_value, "x") # turning the int into its hex value 
      if len(hex_string) == 2: 
       unicode_code = "\\x"+hex_string 
      elif len(hex_string) == 3: 
       unicode_code = "\\u0"+hex_string 
      else: 
       unicode_code = "\\u"+hex_string 
      result += unicode_code 
    return result 

get_unicode_code(d)は、d.encode('unicode-escape').decode('ascii')と同じように返されます。

文字列を引数として受け取り、それが表す文字の代わりにユニコードの文字列を返します。

+0

個人的に私は 'デフget_unicode_code(テキスト)としてその機能を記述します 結果= '' .join( 文字ORD(文字)<他の128であれば '\\ U' +フォーマット(ORD(CHAR) 、 'x') の文字のテキスト ) ' –

+1

@JonathanHartley私のコードを修正して、それをもっとpyononicにしていただきありがとうございます。 この関数は、Deanの最後の行 'd.encode( 'unicode-escape')と同じものを返しますdecode( 'ascii')' 括弧のエラーを修正し、関数を目的の結果にするコードを追加しました。 フォーマットは整数を16進数に変換するためのもので、ユニコードを手動で生成するために使用されます – HolyDanna

+0

ありがとう、私は今すぐ入手します! –

関連する問題