image
于开帅

顺应自然,发挥主观能动性。

再战字符编码问题!

于开帅    2019-07-15 18:25

参考廖雪峰老师的教程:https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896

再战字符编码问题!
首先,需要明确:
1字节(byte) = 8比特(bit)
1k = 1024字节(byte)

编码的历史(按时间顺序):
【一家独大,别人家使用不了】ASCII[1个字节](计算机是鹰酱家发明的,ASCII是仅适用于英文字母、数字和一些符号,即只有127个字符被编码到计算机中)
【多家鼎立,各家用各家的冲突明显】处理中文至少需要两个字节。GB2312(种花家)、Shift_JIS(脚盆鸡家)、Euc-kr(棒子家)
【联合统一,使用英文浪费存储空间】Unicode[通常2个字节]        
【灵活联合统一,节约存储空间】UTF-8[通常,英文字母1个字节,汉字3个字节]
即,ASCII-->GB2312(种花家)-->Unicode-->UTF-8

其次,需要明确:
Python 3的字符串使用Unicode,直接支持多语言。
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或需要传输时,就转化成UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换成Unicode字符到内存中,
        编辑完成后,保存的时候再把Unicode转化为UTF-8保存到文件
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

Python使用ord()获取字符的整数表示,e.g.  ord('A') result:65
      使用chr()把编码转换为对应的字符,e.g.  chr(66) result:'B'
      
1个字符对应若干个字节(byte),
(1)如果Python的字符串(str)在网络上传输或保存到磁盘上,就需要将字符串(str)变为以字节为单位的bytes
Python对bytes类型的数据用带b前缀的单引号或双引号表示,e.g.  x = b'ABC'
'ABC' & b'ABC'区别:显示一样,但bytes的每个字符都只占用一个字节
以Unicode表示的str通过encode()方法可以编码为指定的bytes(如ascii、utf-8等),
e.g.  '中文'.encode('utf-8')  result:b'\xe4\xb8\xad\xe6\x96\x87' (6个字节)
(2)从磁盘或网络上读取了字节流,那么读取到的数据就是bytes,要把bytes变为str,就需要用decode()方法
e.g.  b'\xe4\xb8\xad\xe6\x96\x87'.decode("utf-8")  result:'中文'

len()函数计算的是str的字符数,如果换成bytes,len()函数计算的是字节数

在操作字符串时,我们经常遇到str和bytes的互相转换。
为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,
在保存源代码时,就需要务必指定保存为UTF-8编码。
当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码.

 

 

 

 

 

 

 

 

 

 

 

 

 

Last Modified: 2019-07-15 18:25
Views: 1.5K

[[total]] comments

Post your comment
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]Floor
  2. Click to load more...
  3. Post your comment