【笔记】字符编码格式

/ 0评 / 0

包括ASCII、Unicode、ANSI、GB2312、GBK、GB18030、UTF-8
本文部分内容源于网络并加以修改,再结合我的个人经验来写的,意在通俗地解释编码

字节

网络上曾有一段趣谈,用来解释字节最好不过:

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物,他们把这称为”字节”。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去,他们就把这机器称为”计算机”。

这便是字节,字节有8位,便有256种组合(2^8=256),后来人们开始用这些组合来表示各式各样的字符,那个年代计算机所显示的是英语,故这些组合大部分用来表示大小写字母、阿拉伯数字、标点符号、以及一些用于特殊作用的控制字符。
字节是最原始的编码,而多个字节组成的,称作字节集

ASCII

上述用字节的不同组合规则来表示英语文字,起初用了128种,这个方案便被称为ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),后来又添加了一些符号和特殊字母,直到256种,新的方案被称为EASCII

GB2312

之后ASCII已经不能满足人们了,加上中国人已经开始使用计算机了,但是ASCII并不能用来表示中文,加上中文数量多,于是出现了GB2312,它基于ASCII,采用双字节编码,当用一个不大于127的字节表示时,则与ASCII相同,当用两个大于127的字节组成的长度为2的字节集时,则表示一个中文。GB2312是对ASCII的中文扩展。
除此之外,对于EASCII添加的字符也通过双字节编码的形式加入到GB2312,从此这些添加的字符便分为了两种,一种是单字节的EASCII,另一种是双字节的GB2312,也就是俗称的半角全角
因此,一个中文占两个字节,而一个英语占一个字节。

GBK

由于汉字实在太多了,即使如GB2312这种双字节编码形式也无法满足,后来,人们修改了表示中文的字节集的格式,原先是由两个大于127的字节组成的字节集,修改为由一个大于127的字节为首与一个任意字节组成的字节集。修改后的方案称为GBK
GBK是对GB2312的扩展。

GB18030

再后来,对于GBK,人们再添加了对于少数民族文字的编码,这就是GB18030
GB18030是对GBK的扩展。

Unicode

在当时,各个国家各个语言拥有不同的编码,地区性编码也导致了交流的不便,后来ISO(国际标谁化组织)决定不再基于这些地区性编码,而是着手制定了一套全新的包括全世界语言文字的编码标准,称为Unicode
Unicode标准同样采取双字节单元,但不同的是,对于任何字符,它都采用双字节,更重要的是,Unicode在制定时并不与任何其它编码相兼容,即使它与GB编码同样采取双字节,但两者却有着很大的差别。
双字节即16位,所能表示的组合已经足以满足世界所有语言字符了,Unicode的出现令世界上所有电脑都能在同一编码标准下显示所有文字了,即跨语言,跨平台。
当然,Unicode规定了字节与字符的映射关系,但并没有规定字节该如何储存

ANSI

ANSI是相对于Unicode的字符编码标准,实际上在不同语言的系统上ANSI对应着不同的具体的编码,如在简体中文Windows系统上,ANSI通常表示GB2312(或者其他GB编码);在繁体中文Windows系统上,ANSI表示Big5;在日文Windows系统上,ANSI通常表示Shift-JIS。
ANSI不是一个具体的编码,而是一种标准,是地区性编码(与Unicode编码相对)的总称。

UTF-8

由于Unicode没有规定字节该如何储存,于是有了UTF-8和UTF-16,这两个是较为流行的Unicode编码方式。
UTF-8是当前使用最广泛的Unciode编码方式,它通过可变长度字节集来储存Unicode内容,并且UTF-8在单字节方面兼容ASCII,即可以通过UTF-8编码打开ASCII编码的文件。
取决于具体的字符,UTF-8通常使用1~4个字节来储存字符,但字节与字符的映射关系依然遵循Unicode。

BOM

UTF-8又分为带BOM和不带BOM两种,BOM实际上是UTF-8编码的标志,具体的字节为EF BB BF,如果一段字符集通过UTF-8 BOM编码,那么在编码数据前会添加这三个字节,这三个字节不可视,故在文本编辑器上看起来与不带BOM的是没有区别的。
BOM通常用于快速识别编码,但很多情况下BOM会引起bug。

MUGEN与编码

实际上,在MUGEN中经常会扯到编码,目前MUGEN所支持的编码有ASCII和UTF-8
一般情况下日区人物的文件都采用Shift-JIS编码,国内的话大部分是GB编码,但MUGEN只有在ASCII部分与GB编码兼容,所以GB编码下中文是无法在MUGEN中显示的,于是当需要在游戏中显示中文时文件必须采用UTF-8编码
相同地,Shift-JIS编码除ASCII部分也无法在游戏中正常显示,如果需要在游戏中显示日文时文件也必须采用UTF-8编码

可以看出,UTF-8的兼容性是最强的,于是我建议所有文件都使用UTF-8编码(而不建议UTF-8 BOM)
即使UTF-8在编码成本上高于其他编码格式,但在硬盘空间过剩的现在,这不应该成为阻碍。

当然,大陆外地区的人物可能使用Big5编码,这是繁体中文的地区编码,实际上到了GBK时已经包括了繁体编码,尽管如此,我们依旧建议使用UTF-8编码, 因为无论是Big5编码还是GB编码,繁体字都不能在MUGEN中正常显示。