字符串与编码

来源:互联网 发布:高清网络播放机 编辑:程序博客网 时间:2024/05/16 06:31

字符编码

  • 计算机只能处理数字,如果要处理文本,就必须要把文字转换成数字才能处理。
  • 最早的计算机采用8个比特(bit)作为一个字节(byte)。
  • 一个字节表示的最大整数位255(二进制1111 1111 = 十进制 255),二哥字节可以表示的最大整数是 65535, 4 个字节可以表示的最大整数是 42 9496 7295。

ASCII编码是有127个字符编码到计算机中,大写字母A的编码是 65,小写字母z 的编码是122。
中国定制了GB2312编码,把中文编辑进去,日文使用Shift_JIS编码里,韩文编辑到Euc-kr 里,在多语言混合时容易出现乱码。
因此Unicode 应运而生,Unicode 把所有的语言都统一到一套编码里。

  1. 字母 A 用ASCLL 编码是十进制的 65,二进制的 0100 0001;
  2. 字符 0 用ASCLL 编码是十进制的 48,二进制的 0011 0000;
  3. 汉子的 ‘中’已经超出ASCLL编码的范围,用Unicode 编码是十进制的20013,二进制的0100 1110 0010 1101。
  4. 把ASCLL编码的A 用Unciode 编码,只需要在前面补 0 就可以,因此,A的 Unicode 编码是 0000 0000 0100 0001。

UTF-8 编码

  • UTF-8编码是Unicode 编码转化为可变长的一种编码形式。UTF-8 编码把一个Unicode 字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编写成1个字节,汉子通是3个字节,只有很生僻的字符才会被编码成4-6个字节。
字符 ASCLL Unicode UTF-8 A 0100 0001 0000 0000 0100 0001 0100 0001 中 x 0100 1110 0010 1101 1110 0100 1011 1000 1010 1101

* 计算机的内存中,统一使用的是Unicode 编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

Application (Unicode 编码)—>保存:转换为UTF-8 —> 文件(UTF-8 编码)

文件(UTF-8 编码) —> 读取:转换为Unicode —> Application(Unicode 编码)

服务器 (Unicode 编码) —> 输出UTF-8 网页 —> 浏览器

网页的源码上会有类似 <meta charset="UTF-8"/> 的信息,表示该网页是用UTF-8编码的。

python 中的字符串

python3 版本中,字符串是移Unicode 编码的。
对于单个字符串Python 提供了 ord() 函数获取字符的整数表示,chr() 函数把编码串换为对应的字符:

函数 ord() 获取打个字符的数字表示
函数 chr() 将编码转化为对应的字符

在python 中如果知道字符的整数编码,还可以用十六进制这些么str

>>> '\u4e2d\u6587'
'中文'

这两种写法完全相同。

Python的字符串类型是str,在内存中已unicode 表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

python 对bytes 类型的数据用带b前缀的单引号或者双引号表示:

x = b'ABC'

要注意区分’ABC’ 和 b’ABC’,前者是str,后者虽然内容显得和前者一样,但是bytes 的每个字符都只占用一个字节。

print(b'zhongwen'.__sizeof__()) #25
print('zhongwen'.__sizeof__()) #33

0 0