Подтвердить что ты не робот

Преобразование байтовой строки в строку юникода

У меня есть код такой, что:

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

Почему в последнем случае я вижу код символа вместо символа? Как я могу преобразовать строку Byte в строку Unicode, что в случае вывода я увидел символ вместо его кода?

4b9b3361

Ответ 1

В строках (или Unicode-объектах в Python 2), \u имеет особое значение, а именно: "здесь идет символ Юникода, указанный им Unicode ID". Следовательно, u"\u0432" приведет к символу.

Префикс b'' сообщает вам, что это последовательность из 8-битных байтов, а объект байта не имеет символов Юникода, поэтому код \u не имеет особого значения. Следовательно, b"\u0432" - это просто последовательность байтов \, u, 0, 4, 3 и 2.

По существу у вас есть 8-битная строка, содержащая не символ Юникода, а спецификацию символа Юникода.

Вы можете преобразовать эту спецификацию с помощью кодера escape-кода unicode.

>>> c.decode('unicode_escape')
'в'

Ответ 2

Любимый Леннарт ответил. Это поставило меня на правильный путь для решения конкретной проблемы, с которой я столкнулся. Я добавил, что это возможность создавать html-совместимый код для \u???? спецификации в строках. В принципе, нужна только одна строка:

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

Все это связано с необходимостью конвертировать результаты JSON в то, что хорошо отображается в браузере. Вот несколько тестовых кодов, интегрированных с облачным приложением:

# References:
# http://stackoverflow.com/info/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/info/606191/convert-bytes-to-a-python-string
# http://www.w3schools.com/charsets/ref_utf_punctuation.asp
# http://stackoverflow.com/info/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)