UTF-8和GBK编码

时间:2023-01-05 10:19:35


之前只大概了解过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等编码转为十六进制。
但是由于浏览器和浏览器设置的不同,编码的字符集也不同,会导致解码出错的问题。
具体可以参考这里