2.1.1 编码方式科普
(参考资料 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html)
Unicode 只是一个符号集,它只规定了符号的 二进制代码 ,却没有规定这个二进制代码应该 如何存储
其中有的字符只有 1B ,有的有 4B ,多出来的会有很多 0 ,这不太好,那有什么办法呢?UTF-8 可以很好地解决这个问题,其他方式此处不做讨论
UTF-8 就是在互联网上使用最广的一种 Unicode 实现方式 ,解决了怎么存储 Unicode 中的二进制编码 ,存储方式如下:
UTF-8 编码 |
---|
0xxxxxxx |
110xxxxx 10xxxxxx |
1110xxxx 10xxxxxx 10xxxxxx |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
下面详细讲述 一
转换成 utf-8 :
- 拿到
一
的 unicode 编码'\u4e00'
(可以用python报错或baidu) - calc 计算一下
4e00
为100 1110 0000 0000
- 填入上面表格( 15 - 6 - 6 - 3 ) 得到
11100100 10111000 10000000
- calc 计算
11100100 101110 001000 0000
为E4 B880
- python 验证
一
的 utf-8 编码
test_str = '一'
print(test_str.encode())
2.1.2 Python encode() 详解
- ASCII码表内字符:变成 bytes 类型原样返回
- ASCII码表外字符:先 查找 到 unicode 编码,再进行储存方式上的编码,返回类型也是 bytes
test_str = 'My name is Ståte'
print(test_str.encode()) # > b'My name is St\xc3\xa5te'
证明:encode() 先 查找到 Unicode 编码,再 进行其他编码
test_str = '一'
print(test_str.encode('ascii'))
# 写一个报错程序,它会提示你 'ascii' codec can't encode character '\u4e00'
# 这说明了有一个转换步骤 先拿到了 一 的 Unicode 码
2.1.3 encode() 看法
刚学的时候感觉很奇怪,为什么 非ASCII码内字符 encode 后是16进制,而 ASCII码内字符 encode 后不变
后来想清楚了,encode 主要用于不同语言之间的交流,而 ASCII码内字符 几乎同全球通用的,没必要利用 Unicode 再中转一下
2.1.4 补充
函数 | 说明 |
---|---|
ord('character') | 返回某个字符的 Unicode 值,10进制 |
chr(number) | 查询一个 10进制 Unicode 值对应的字符 |