编码格式笔记

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
ANSI(American National Standards Institute 美国国家标准学会)
汉字的Unicode编码和ANSI编码,GBK是汉字的ANSI编码,UTF-8是汉字的Unicode编码

ASCII历史
标准ASCII码由一个字节,也就是八位的二进制数表示字符,八位二进制数最多能表示256种不同字符;
最初只使用了前128个码值,也就是前七位,最高位用作校验符
0x00 ~ 0x1f 前32个码表示控制码,比如换行、ESC等
0x20 ~ 0x3f 表示空格(码值32)、运算符、数字(码值48)等
0x40 ~ 0x5f 表示@(码值64)、大写字母(A的码值是65)等
0x60 ~ 0x7f 表示小写字母(a码值97,与A相差32)、DEL(码值127,最后一位)

扩展ASCII码后面128 ~ 255被其他国家或组织用来表示新的字符,称为扩展字符集
扩展字符集例子
IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符
ISO 8859-1Latin 1(简称为ISO Latin-1),它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码


GB2312 中国对ASCII编码的扩展
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1到 0xF7,后面一个字节(低字节)从0xA1到0xFE;
大于128的编码作为一个Leading Byte,紧跟在Leading Byte后的第二(甚至第三)个字符与Leading Byte一起作为实际的编码
对于汉字的ANSI编码而言,无所谓MSB, LSB。它就是把第一个字节理解为Leading Byte,第二个字节理解为另外的编码,所以它们在内存里的存放次序不能倒过来,否则就理解不对了。
GB2312保留了128个ASCII编码,并在扩展编码中对其进行了重新编码,ASCII码称为半角字符,GB2312对ASCII的重新编码称为全角字符;

GBK 由于GB2312的编码容量过小,于是重新设计的编码
不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是 扩展字符集里的内容
GBK包含GB2312的所有内容

GB18030在GBK的基础上加入少数民族语言字符

ISO(国际标准化组织)

UNICODE(Universal Multiple-Octet Coded Character Set,简称UCS)
统一用两个字节来表示所有字符,可以表示65535种字符(对最新的标准这种说法是错误的
它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。
对8位的ASCII码扩展为16位,高8位为0,保存英文时相比ASCII码存储空间增加一倍
ASCII码不兼容其他国家的编码,ASCII码与GBK没有一种简单的算数方法可以对其转换,只有查表

UTF(UCS Transfer Format)
如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8 就是每次8个位传输数据,而 UTF16 就是每次16个位,只不过为了传输时的可靠性,从UNICODE到 UTF时并不是直接的对应,而是要过一些算法和规则来转换。
UTF(Universal Transformation Format)
蒙B,到底是传输,还是转换

UTF-8 是Unicode的一种变长字符编码,
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII
码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中
文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

如何识别变长字符编码,使用特定的标记码

Unicode转UTF-8
UTF-8是这样做的:
1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。


GB2312与Unicode编码冲突,BOM
windows记事本”不能单独保存“联通”:
GB编码的“联通内码包含Unicode编码的标记码,Unicode编码第一个字节前三位是110,第二个字节前两位是10,“联通”的GB编码正好符合。使用记事本单独保存“联通”,默认是以ANSI格式保存(此处有个疑问,为什么不是保存为GB编码格式,记事本也没有提供GB格式的选项,中文的ANSI格式是否就是指GB格式)
在简体中文windows系统中ANSI表示GBK
BOM是windows自动的编辑软件在保存UTF-8文件时自动在文件头部加上的隐藏字符标记
windows记事本打开文件的编码格式是如何确定的,上面的“联通”的例子中,保存为ANSI编码后打开,
没有BOM头,为什么记事本还以UTF-8格式打开

带BOM头的PHP文件显示的时候顶部不能贴合,有隐藏文字     

-------------------------------------------------------------------------

字符在显示屏上以图形的形式存在,在内存和磁盘中以字节数组的形式存在,这两者之间是如何转换的呢?

字符集:字符图形的集合,列出了我们想要在计算机屏幕上显示的图形和不显示的控制字符

编码表:将字符集中的字符或图形与一个唯一的数字(码值、码点)对应,形成一张表

编码(格式):将某个字符集的编码表中的码值按某种方式转化成磁盘或内存中的字节数据

解码(格式):编码的逆向操作

https://www.cnblogs.com/developerY/p/3575271.html

猜你喜欢

转载自my.oschina.net/u/3160411/blog/1590664