37

私は次のようなコードを持っています:

a = "\u0432"
b = u"\u0432"
c = b"\u0432"
d = c.decode('utf8')

print(type(a), a)
print(type(b), b)
print(type(c), c)
print(type(d), d)

そして出力:

<class 'str'> в
<class 'str'> в
<class 'bytes'> b'\\u0432'
<class 'str'> \u0432

後者の場合、文字の代わりに文字コードが表示されるのはなぜですか?バイト文字列をUnicode文字列に変換するにはどうすればよいですか?出力の場合、コードではなく文字が表示されますか?

4

2 に答える 2

60

文字列 (または Python 2 の Unicode オブジェクト) では\u、「Unicode ID で指定された Unicode 文字がここに来る」という特別な意味があります。したがってu"\u0432"、文字 в になります。

プレフィックスは、b''これが 8 ビット バイトのシーケンスであることを示しており、bytes オブジェクトには Unicode 文字がないため、\uコードに特別な意味はありません。したがって、は、 、、、、およびb"\u0432"のバイト シーケンスです。\u0432

基本的に、Unicode 文字ではなく、Unicode 文字の仕様を含む 8 ビット文字列があります。

この仕様は、Unicode エスケープ エンコーダーを使用して変換できます。

>>> c.decode('unicode_escape')
'в'
于 2012-12-12T10:47:40.997 に答える
1

レナートの答えが大好きです。それは私が直面していた特定の問題を解決するための正しい道に私を置きました. 私が追加したのは、\u???? の html 互換コードを生成する機能です。文字列の仕様。基本的に、必要な行は 1 行だけです。

results = results.replace('\\u','&#x')

これはすべて、JSON の結果をブラウザーで適切に表示されるものに変換する必要から生じました。クラウド アプリケーションに統合されたテスト コードを次に示します。

# References:
# http://stackoverflow.com/questions/9746303/how-do-i-send-a-post-request-as-a-json
# https://docs.python.org/3/library/http.client.html
# http://docs.python-requests.org/en/v0.10.7/user/quickstart/#custom-headers
# http://stackoverflow.com/questions/606191/convert-bytes-to-a-python-string
# http://www.w3schools.com/charsets/ref_utf_punctuation.asp
# http://stackoverflow.com/questions/13837848/converting-byte-string-in-unicode-string

import urllib.request
import json

body = [ { "query": "co-development and language.name:English", "page": 1, "pageSize": 100 } ]
myurl = "https://core.ac.uk:443/api-v2/articles/search?metadata=true&fulltext=false&citations=false&similar=false&duplicate=false&urls=true&extractedUrls=false&faithfulMetadata=false&apiKey=SZYoqzk0Vx5QiEATgBPw1b842uypeXUv"
req = urllib.request.Request(myurl)
req.add_header('Content-Type', 'application/json; charset=utf-8')
jsondata = json.dumps(body)
jsondatabytes = jsondata.encode('utf-8') # needs to be bytes
req.add_header('Content-Length', len(jsondatabytes))
print ('\n', jsondatabytes, '\n')
response = urllib.request.urlopen(req, jsondatabytes)
results = response.read()
results = results.decode('utf-8')
results = results.replace('\\u','&#x') # produces html hex version of \u???? unicode characters
print(results)
于 2016-02-09T23:29:35.820 に答える