python - UTF8 中的 Python 字符串 '\x80' 占用多少字节?
问题描述
UTF8 中 '\x80' 占用多少字节?
在 Python 中,我写:
>>> '\x80'.encode('utf8')
b'\xc2\x80'
这表明 '\x80' 转换为两个字节。
另外,反过来:
>>> b'\x80'.decode()
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
这是否意味着字节'\x80' 本身在 UTF-8 中没有(字符)含义?
解决方案
Unicode 字符U+0080(它是一个控制字符:PAD)在 UTF-8 中被编码为两个字节,分别是 0xC2 和 0x80。
仅包含字节 0x80的字节流本身并不代表任何内容的有效 UTF-8 编码(即,仅该字节本身就是格式错误的 UTF-8 流)。
基本上,UTF-8 流中的每个字节都可以归类为三种不同类型之一:
- 单字节序列:0x00-0x7F (0-127) 范围内的字节单独表示单个 Unicode Codepoint(这部分相当于旧的 US-ASCII 编码)
- 前导字节:0xC0-0xFD (192-253) 范围内的字节开始一个多字节序列并指示该序列必须有多长*
- 连续字节:0x80-0xBF (128-191) 范围内的字节是多字节序列的其余部分。
0x80 是一个连续字节,因此它不能独立存在(它必须以前导字节开头,并且可能还有其他一些连续字节才有效)。
关于 UTF-8的Wikipedia 文章有一些非常广泛的文档以及很好的示例。
* 请注意,由于各种原因,某些前导字节永远不会出现在有效的 UTF-8 中,因此实际使用的前导字节范围较小。同样,0xFE 和 0xFF 只是从未使用过,因此也永远不会出现在有效的 UTF-8 中。
推荐阅读
- php - Symfony 验证错误:preg_match():编译失败:偏移处的字符类范围乱序
- sql - 创建多语句用户定义函数时,BEGIN 附近的语法不正确
- java - 如何避免 json 对象的字符串值中的 javascript 注入以及 javascript 注入包含在 java 中的哪个列/属性?
- python - 2D NumPy 数组中的逐行外积
- html - 如何在没有引导程序的情况下自定义 django 表单和成功消息?
- javascript - 如果 isNaN 不是数字或字符串,则 console.log 字符串为空
- java - Spring CasAuthenticationEntryPoint 给了我 CORS 错误
- php - 有没有办法让唯一使用指定电子邮件的用户登录支持控制台
- go - Golang API Post 上传文件
- python - 如何单击 python selenium 中弹出的警报