在unicode字符串中转换字节字符串

Posted

技术标签:

【中文标题】在unicode字符串中转换字节字符串【英文标题】:Converting byte string in unicode string 【发布时间】:2012-11-30 01:03:53 【问题描述】:

我有这样的代码:

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 字符串,以便在输出时我看到的是字符而不是其代码?

【问题讨论】:

【参考方案1】:

在字符串(或 Python 2 中的 Unicode 对象)中,\u 有一个特殊的含义,即“这里有一个由它的 Unicode ID 指定的 Unicode 字符”。因此u"\u0432" 将产生字符в。

b'' 前缀告诉你这是一个 8 位字节序列,而 bytes 对象没有 Unicode 字符,所以 \u 代码没有特殊含义。因此,b"\u0432" 只是字节序列\,u,0,4,32

本质上,您有一个 8 位字符串,其中不包含 Unicode 字符,而是包含 Unicode 字符的规范。

您可以使用 unicode 转义编码器转换此规范。

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

【讨论】:

在使用 redis 集并尝试将它们转换为 json 时遇到了这个问题。 Redis 返回一组字节数据。使用unicode_escape 效果很好【参考方案2】:

喜欢 Lennart 的回答。它使我走上了解决我所面临的特定问题的正确轨道。我添加的是为 \u?? 生成与 html 兼容的代码的能力?字符串中的规范。基本上只需要一行:

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

这一切都源于需要将 JSON 结果转换为在浏览器中显示良好的内容。以下是一些与云应用程序集成的测试代码:

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

【讨论】:

以上是关于在unicode字符串中转换字节字符串的主要内容,如果未能解决你的问题,请参考以下文章

字符编码 and 字节和字符串转换(待补充)

golang unicode/utf8源码分析

c语言怎么把UTF-8转换成Unicode

如何将unicode字符转换成汉字?

javaIO流之字节到字符流的转换流

如何将4字节utf-8的emoji表情转换为unicode字符编码