目录
ASCII——英文
GBK——中文
Unicode——各国语言都有
UTF-8——节省空间
计算机通用的字符编码工作方式
常用编码介绍一览表
编码与解码
ASCII——英文
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。统一规定了常用符号用哪些二进制数来表示。
ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字;
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。来自ASCII是什么
GBK——中文 GBK全称《汉字内码扩展规范》,是对GB2312编码的扩展,因此完全兼容GB2312-80标准。GBK共收录21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字。
来自html中文网
Unicode——各国语言都有
GBK全称《汉字内码扩展规范》,是对GB2312编码的扩展,因此完全兼容GB2312-80标准。GBK共收录21886个汉字和图形符号,其中汉字(包括部首和构件)21003个,图形符号883个。GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字。
来自html中文网
统一码(Unicode),也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode把所有语言都统一到一套编码里,避免了乱码问题。
Unicode有两个特点:
1.支持全球所有语言
2.可以跟各种语言的编码自由转换
UTF-8——节省空间
UTF是为Unicode编码设计的一种在存储和传输时节省空间的编码方案。
为了优化Unicode占的空间,规定:
英文占1个字节
西欧占2个
中文占3个
因此,UTF-8也称为可变长的编码,一般存到文件里或者网络发送时用UTF-8,但是在内存里,仍然是Unicode。这是python3的特点;
但在python2中,内存里的字符默认是ASCII;
mac、Linux默认系统编码是UTF-8;
Windows中国版,默认是gbk。
UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。 UTF-8最大的一个特点,就是它是一种变长的编码方式。 它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。
参考: www.zhihu.com/question/23374078
计算机通用的字符编码工作方式
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。
常用编码介绍一览表 编码与解码
因为数据以01的形式(机器码)存储在内存中,对人类来说是不可读的,所以要解码;反过来人类要把可读的文字存储到内存中,需要编码为计算机可以使用的数据。
任意编码转换成Unicode的过程,都叫解码:
语法:str.decode(''字符串")
Unicode转到其他编码的过程,叫做编码:
语法:str.encode(''gbk")(以转化为gbk编码为例)
decode() 和 encode()
decode() 函数有两个可选的参数: bytes.deocde(encoding="utf-8", errors="strict") ,encoding指编码,不指定则使用默认使用utf-8编码,
error有三种取值:strict、ignore和replace,默认使用strict
strict 对于任何无法被解码的字符都抛出错误ignore 忽略无法被解码的字符replace 替换无法被解码的字符
(其它取值与codecs.register_error(name, error_handler)有关,不再讨论)
很显然后两者都不是什么好办法,最好的方法是让它抛出错误,然后再检查数据是否存在问题。
encode()与前者相反,encode()将字符串编码为字节,参数与前者相同。 因为汉字或其他语言文字需要两到三个字节来存储,字节类型的字面量表示只支持ASCII字符:
>>> b = b"你好,世界" File "", line 1SyntaxError: bytes can only contain ASCII literal characters.
所以我们需要encode()来获得ASCII之外的字符(比如汉字)的字节类型:
>>> s = "你好,世界">>> s.encode()b'xe4xbdxa0xe5xa5xbdxefxbcx8cxe4xb8x96xe7x95x8c'
来自橙叶博客
附:
进制转换:【最强干货】详解二进制,八进制,十进制,十六进制的相互转换
字节类型:
字节类型可以存储任意格式的数据,远远不限于文本,可以说图片、视频、音频等等,所以字节类型有更广阔的使用空间,是进行底层编程的不可或缺的工具。 字节类型转换为字符串类型的过程为解码,反之则是编码:
参考: www.orgleaf.com/3375.html
可以理解为,字节类型就是二进制格式,只不过为了易于理解和人类计算,用十六进制来表示。