【python爬虫学习笔记】Uicode、utf-8、encodeURI、base64等编码、解码问题

这里写自定义目录标题

Unicode及utf-8

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

Unicode

Unicode是一个字符集,规定着每一个字符的二进制形式(每个字符,对应到那个数字);

utf-8

unicode虽然规定了每个字符的二进制形式,但是没有规定计算机如实存储和表示这种二进制。
Q:为什么会考虑如何存储的问题?直接存储一个数字不就好了吗?
A:这个问题要从以下两个方面来考虑:

  1. 一是世界上不止unicode字符集,若是使用数字直接表示,则计算机不知道应该是按照那种字符集来翻译(当然这个问题,我们可以加一些约定和申明)。
  2. 第二个问题是,unicode的字符集体系非常的庞大,当把一串unicode字符转换为二进制表示后,就涉及到到底用多少个二进制位,来解释成一个数字的问题,若是不用固定的二进制长度,那么数字编码较小的字符占据的二进制位就少,空间就小一些(但是这是个变长的序列,计算机不知道到底用多少位来解释成一个数字),还有就是若是使用定长的序列来表示,那么内存开销就会非常大,因为需要用最大字符的二进制长度,来表示每个字符对应的数字编码。

针对以上问题,utf-8编码就应运而生了,utf-8编码是unicode字符集的一种表现方式,,通过变长的序列,来表示unicode字符集,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

utf-8的编码方式很简单,就是两种:

  1. 对于单个字节表示的符号,字节的第一位设置为0,后面7位为这个字符的unicode编码,这样就能够兼容ASCII码。
  2. 第二多个字节(假设为 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值