之前只大概了解过UTF-8和GBK编码,最近遇到头疼的编码问题,参考一些资料整理了一下作备忘。厚颜写上原创。
更具体的可以参考:http://www.iteye.com/topic/560229
1、简介
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),而为了存储文字和符号,就需要一套文字符号与二进制数的转换规则,就是编码。其中,ASCII码,就是由美国国家标准学会制定的,标准的单字节字符编码方案。标准ASCII 码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
Unicode,是为了解决传统编码在不同国家语言不兼容的问题产生的统一编码,范围为0-0x10FFFF。
GBK,国标,是汉字编码标准之一,由*全国信息技术标准化技术委员会于1995年12月1日制订。使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。
UTF-8,Unicode的一种实现方式,使用1-4个字节来对Unicode编码。
Unicode/UCS-4
|
bit数
|
UTF-8
|
byte数
|
备注
|
0000 ~
007F
|
0~7
|
0XXX XXXX
|
1
|
|
0080 ~
07FF
|
8~11
|
110X XXXX
10XX XXXX
|
2
|
|
0800 ~
FFFF
|
12~16
|
1110XXXX
10XX XXXX
10XX XXXX
|
3
|
基本定义范围:0~FFFF
|
1 0000 ~
1F FFFF
|
17~21
|
1111 0XXX
10XX XXXX
10XX XXXX
10XX XXXX
|
4
|
Unicode6.1定义范围:0~10 FFFF
|
2、python的字符串和编码
python中,2.x和3.x的字符串是有区别的。
2.x中str类型是UTF8、GBK等编码后的字符串,在2.2开始增加Unicode类型,以u'XXXX'这种格式的字符串就是Unicode类型。str与Unicode转换:unicode(str,"utf8")和unc.encode("utf8")(编码方式根据具体情况更改)。
3.x中str类型跟2.x中unicode类型类似,是以unicode形式存储。增加bytes类型,以b’XXX‘格式定义。str和bytes之间通过uni.encode('utf-8')和bytes.decode('utf-8')(编码方式根据具体情况更改)转换。
3、Url中的编码
url中,有些字符有特殊含义,如’/‘、’&‘等等。如果url内容(如参数)中包含了这些字符,就需要转换,例如空格转换为’%20',’&‘转换为‘%26’,其实就是按照字符集将字符转换为十六进制,并带上‘%’。中文字符也是,按照UTF-8、GBK等编码转为十六进制。
但是由于浏览器和浏览器设置的不同,编码的字符集也不同,会导致解码出错的问题。
具体可以参考这里。