这里写自定义目录标题
Unicode及utf-8
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
Unicode
Unicode是一个字符集,规定着每一个字符的二进制形式(每个字符,对应到那个数字);
utf-8
unicode虽然规定了每个字符的二进制形式,但是没有规定计算机如实存储和表示这种二进制。
Q:为什么会考虑如何存储的问题?直接存储一个数字不就好了吗?
A:这个问题要从以下两个方面来考虑:
- 一是世界上不止unicode字符集,若是使用数字直接表示,则计算机不知道应该是按照那种字符集来翻译(当然这个问题,我们可以加一些约定和申明)。
- 第二个问题是,unicode的字符集体系非常的庞大,当把一串unicode字符转换为二进制表示后,就涉及到到底用多少个二进制位,来解释成一个数字的问题,若是不用固定的二进制长度,那么数字编码较小的字符占据的二进制位就少,空间就小一些(但是这是个变长的序列,计算机不知道到底用多少位来解释成一个数字),还有就是若是使用定长的序列来表示,那么内存开销就会非常大,因为需要用最大字符的二进制长度,来表示每个字符对应的数字编码。
针对以上问题,utf-8编码就应运而生了,utf-8编码是unicode字符集的一种表现方式,,通过变长的序列,来表示unicode字符集,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
utf-8的编码方式很简单,就是两种:
- 对于单个字节表示的符号,字节的第一位设置为0,后面7位为这个字符的unicode编码,这样就能够兼容ASCII码。
- 第二多个字节(假设为 n 且 n>1)表示的符号,第一个字节的前n位使用1来表示,第n+1位使用0来表示,后面的字节统一使用10开头,剩余的字节填充这个unicode的二进制位。
下面使用“田”这个汉字为例,结合python代码,展示如何实现unicode编码。
```python
import sys
# 1. 获取汉字的unicode表示
uni_str = ord('田') # ord函数表示获取的是十进制表示
# 若要获取16进制表示,则使用
hex_str = hex(ord('田'))
print('10进制表示下的“田”:{},\n16进制下表示的“田”:{}'.format(uni_str,hex_str))
# 2. 获取汉字“严”的二进制表示
bina_str = bin(uni_str) # 将一个数字转换为二进制表示
print('二进制表示下: ',bina_str)
# 3. utf-8编码表示下的“田”
utf_8_str = '田'.encode('utf-8')
print('utf-8表示下(16进制):',utf_8_str)
print('utf-8表示(二进制)',bin(int.from_bytes(utf_8_str,byteorder='big'))) # 为了便于显示,这里使用了big表示方法
上述内容参考至阮一峰老师的博客内容: https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html