python编解码

编码方式

ASCII码

美国信息交换标准代码(American Standard Code for Information Interchange,简称ASCII)是一种用于信息交换的美国标准代码,它的作用是给英文字母、数字、标点、字符转换成计算机能识别的二进制数规定了一个大家都认可并遵守的标准。

ASCII共256个,常用的是0-127 ,共128个

GB2312编码

适用于汉字处理、通信等系统之间的信息交换 。“GB"是汉语拼英"guobiao”/"国标"的缩写,它是对ASCII的中文扩展。

GB2312约6763个简体汉字。没有生僻字。

GBK编码

是汉字编码标准之一,是在GB2312-80 标准基础上的内码扩展规范,使用了双字节编码。向下兼容GB2312。

GBK包含GB2312的同时,又增加了近20000个新的汉字,有生僻字。

BIG5编码

BIG5是目前中国台湾和中国香港地区普遍使用的一种繁体汉字的编码标准,包括440个符号,一级汉字5401个,二级汉字7652个,共计13060个汉字,所谓一级汉字与二级汉字对应于常用汉字和不常用汉字。

ANSI(扩展的ASCII编码)

与你使用的windows操作系统的语言有关系的,在简体中文版windows中就是GBK,在繁体中文Windows系统中代表BIG5、在日文Windows系统中代表Shift-JIS(用一个字节表示英文,用两个字节表示一个中文)。

Unicode编码

这是一种世界上所有字符的编码,但是它没有规定的存储方式。

Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。

现代操作系统和大多数编程语言都直接支持Unicode。

范围:0x000000-0x10FFFF(十六进制),有110多万

Unicode只能用于内存,不能用于存储到磁盘,如果想要将Unicode的内容存储到磁盘需要使用encode()进行转换。

为了保存Unicode,衍生出了UTF-8、UTF-16和UTF-32存储编码,通常情况使用UTF-8

UTF-8编码

是Unicode Transformation Format -8 bit 的缩写,UTF-8 是Unicode 的一种实现方式。它是可变长的编码方式,可以使用1~4 个字节表示一个字符,可根据不同的符号而变化字节长度。

注意:

 1) UTF包含全世界所有国家需要用到的字符(因为来自Unicode)

  2)UTF的中文所占用字节比GBK占用字节多(UTF占3个,GBK占2个),所以如果中文出现比例高的文本,一般用GBK,而不是UTF-8,如中文操作系统,简体用的是GBK,繁体是BIG5。

  3)UTF是针对Unicode编码的,如果GBK与UTF互转,需要用Unicode做中介

 4) Unicode、GB、BIG5等是对文字的编码规则,而UTF是对Unicode的存储(传输)规则,不是对文字的编码规则

  5)并列、包含和兼容关系:

      BIG5、GBK、Unicode是并列关系;

      GBK包括了GB2312的字集,编码也相同;(兼容)

      Unicode为世界650种语言进行统一编码,兼容ISO-8859-1

几种主要编码的比较

 1)UTF-8编码有一个额外的好处就是ASCII编码实际上可以被看成是UTF-8编码的一部分。如果你的程序全部是ASCII表里的字符,都不需要做转换,直接可使用。

2)大量只支持 ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

UTF-8、UTF-16和UTF-32的区别

1) UTF编码方式的设计初衷主要就是节省空间,UTF-8因为兼容ASCII,可以使用一个字节表示英语世界常用字符,比较省空间和带宽。UTF-8是变长的字符串。主流使用UTF-8编码,兼顾空间和功能处理的便捷性。

2)UTF-16因为使用两个字节为单位,所以分大尾和小尾,用的很少。

3) UTF-32表示任何字符都是4字节,缺点太占空间,基本不使用。

python代码的中文

python2和python3的区别:

python2:

s="中国我爱你"    

1)type(s)查看是str类型,编码方式:通过在文件中设定encoding=UTF-8或encoding=GBK来设定str的编码类型。想获得Unicode类型,需要使用decode()解码。如:s.decode("GBK")

2)print不用加括号,如:print s

3)写文件时,s带有编码信息。

     fp = open("xxx",w)

     fp.write(s)   ----->s是带有编码信息的,文件变为了GBK编码的类型

python3:

s="中国我爱你"   

1)  type(s)查看也是str类型,但编码方式是Unicode。如果s.encode("GBK") 之后变成bytes类型(即编码格式为GBK了)

2)print需要加括号,如:print (s)

3)写文件,s不带有编码信息

    fp = open("xxx",'w',encoding="UTF-8")

    fp.write(s)   ----->s是不带有编码信息的,文件存什么编码,需要用encoding参数指定

 结论:

1) python3的字符串默认是Unicode编码,因为 Unicode把所有语言都统一到一套编码里,所以Python3几乎已经不需要考虑中文字符不兼容的问题。不单字符串中可以使用中文,且变量名也可以使用中文

 

python字符串与编码

python的字符串类型

1)  Unicode的字符串:默认类型,或者被字节字符串decode 后的类型

2)  字节字符串:bytes类型,被encode 后的字符串类型

 

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

4)  用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8

 5)  浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

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

 

问题:

1、python2不写UTF-8,中文在控制台就乱码,怎么理解?

win7的控制台是GBK,只能显示GBK或Unicode,不能显示UTF-8

 乱码的原因:

1)  你没有解码为Unicode来显示     

2)  你的bytes类型编码在当前控制台不支持。

 比如:控制台收到了一个UTF-8的bytes类型,它会自动地用控制台的默认编码去decode来获取Unicode来显示, 如果控制台默认的编码是UTF-8,这个解码肯定没问题;如果控制台默认是GBK,解码肯定就失败。

同理:控制台如果默认编码是UTF-8,你传来一个GBK的bytes字符串,这个能解码么?肯定不能。

2、encode和encoding有什么区别?

encode是一个方法:字符串才能用的。比如:”hello”.encode(“UTF-8”)

encoding是个参数:1 open的时候读写文件的时候用,2 在python文件的第一行去用 比如:#encoding=UTF-8

3、新建一个a.py文件,文件里只写了一句: print("我爱中国"),在控制台执行py a.py的时候报错了,报错信息如下,请问是什么问题导致的?应该怎么修改?

报错信息:

e:\>py a.py

  File "a.py", line 1

SyntaxError: Non-UTF-8 code starting with '\xce' in file a.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

原因:

1)新建文件时,默认是ANSI编码(GBK),那么文件内容也是GBK编码。

2)python编译器要放到内存里面执行这个代码,这个时候需要的是Unicode类型。

3)因为文件的内容是bytes不能直接当做Unicode放到内存中给编译器使用,所以必须解码,下一个问题解码我要用什么编码去解码呢?

4)如果你没有设定编码类型,那么python默认用的是UTF-8来解码。

5)文件中是GBK编码,你用UTF-8去解码,解码肯定不成功,所以报错了。

解决方法:

1)  将文件另存为UTF-8的编码格式。修改存储的编码和默认的解码一致。

2)  或者在python文件第一行加上 #encoding=GBK

        修改默认的解码方式与存储编码方式一致。

        如果python文件不加encoding参数,那么默认等于#encoding=UTF-8  

   

4、新建的.py文件什么要加encoding=GBK,而不是encoding=UTF-8,在pychram 中encoding=UTF-8就可以。

原因:

1)pycharm所有的文件默认保存的字符集都是UTF-8

2)#encoding=GBK  #设定了一下python默认解码字符集
   #如果你文件保存的是GBK,那么你必须#encoding=GBK才可以
   #如果你文件保存的是UTF-8,那么你可以写#encoding=UTF-8 也可以不写,默认会加一个#encoding=UTF-8  

总结:

1)  你的程序如果使用UTF-8编码保存,则文件的第一行写上#encoding=UTF-8。

 

2)  你的程序如果使用GBK编码保存(即ANSI),则文件的第一行写上#encoding=GBK。

 

3)  建议:不管程序里有没有中文,文件都保存为UTF-8,文件的第一行写上#encoding=UTF-8

 

猜你喜欢

转载自www.cnblogs.com/anne32184/p/13188000.html