概述
前言
字符编码的重要性,不言而喻。在这个疫情严重的但又比较悠闲的下午,写个文章打发下时间也不错,同时希望福建的疫情赶紧好起来~
这是第一次写这类文章,若有错误或更好的见解,我希望您能抽空在评论中指正,感激不尽!
如果你只是想快点知道GBK如何转UTF8,string如何转wstring,那么这篇文章肯定不适合你,快点去找其它文章吧~
早期编码
早期的编码也就是ASCII编码,它用7位二进制表示0~127总共128个不同的字符。有常见的ABCD等普通字符,也有不可以打印出来的控制字符。
然而计算机的1字节有8位的空间,这个ASCII编码只用了7位,还有1位没使用到,这1位对应着128~255这128个新的未定义过的字符。所以,当时在不同地区,都有着不同的OEM字符集来定义这256个字符。
然而这样下去可不行,你想想,每个人都可以定制这字符岂不是乱套了。我给你发ABCD,你解析出来是1234。所以后来OEM字符集被纳入了ANSI标准。
在这个标准中,前面128个字符和ASCII一样。后面的128个字符取决于你计算机所在的地区。所以,只知道编码是不够的,还得知道你得位于哪个国家地区,这也就是代码页(Code Page)。
网上都说代码页是字符编码的别称。从我个人角度看,可能不太正确。我更倾向于代码页是查找表,从指定的字节映射到指定字符,从而显示出指定的字形。而之前的ASCII编码,是没有映射环节这一说的。
亚洲地区编码
如果全世界都只用英文,那么上面的设计简直太完美了。但可惜的是,光是中国常用汉字就有几千个,更别说其它亚洲地区加起来的字符总和了。所以8字节256个字符的设计是远远不够的。为此,Unicode诞生了。
Unicode字符集
Unicode创建了统一的Unicode字符集,它为所有的字符都分配了唯一的一个数,英文称为Code Point,中文里我个人觉得叫编号比较合适。例如字母H,它在Unicode字符集里的编号为U+0048。其中"U+"表示Unicode。
在设计方面,Unicode的字符集和编码方式是分离的,这点要切记!也就是说针对Unicode字符集,有多种不同的编码方式
Unicode字符的编码
在最开始的时候,Unicode是采用2字节对Unicode里面的字符进行编码的。这个编码称为UCS-2或者UCS-16(2字节16位),它能表示0000~FFFF总共65536个字符。
比如字母H(U+0048),我们可以编码为"00 48"。但是到这里可能有人就不满意了,有的机子是小端模式,凭什么不编码成"48 00"呢?
所以人们又想出了一个约定,在编码前添加2个字节FF和FE,用来分辨大小端。例如FF FE开头,则是小端模式,FE FF开头则是大端模式。这个又称之为BOM(Byte Order Mark),也就是字节标记顺序。所以,UCS-2的小端模式也称为UCS-2-LE(Little Endian),大端模式称为UCS-2-BE(Big Endian)。
然而这没有根治人们的问题,比如我就只表示字母H,ASCII已经帮我用1字节表示了,为何我要用2字节去表示这没意义的东西?这无疑造成了巨大的浪费,所以Unicode在一段时间内没有受到重视。
UTF-8编码
为了解决上面这个问题,UTF-8作为新的Unicode编码方式诞生了。
UTF-8采用了可变长度的方式来编码Unicode的字符。0~127的字符只采用1字节,128以上的字符采用2字节到最高6字节的方式来编码。
如果我要表示H,那么只要"48"就够了,如果我要表示其它更多的字符,完全可以用2字节,3字节甚至更高的字节来表示。
关于UTF-8内部的具体编码格式,这里不做展开。
其它编码
针对Unicode字符集,还有很多的编码方式。例如后来出现的UCS-4,由最初的UCS-2的2字节扩展到了4字节。
还有一些流行的英文编码,比如ISO-8859-1,也就是Latin-1编码,0~127向下兼容了ASCII。后面的128分别存储了西欧,希腊,阿拉伯语等的文字符号。
在中国,有GB2312,GBK,BIG-5等编码。其中GB2312包含简体中文,BIG-5(大五码)包含繁体中文,GBK则把简繁中文都囊括了进去。
Windows下的ANSI编码
在windows,ANSI编码默认是你的语言编码。例如简体中文,则是GBK。
非常常见的问题就是windows记事本乱码问题。例如你在简体中文的记事本写了几个中文保存后,它默认就是GBK编码。如果你这个记事本发给了台湾同胞,那么台湾同胞的BIG-5编码打开后就是显示乱码了。
但是记事本是识别Unicode的,这需要你在记事本前添加BOM头。如果在记事本前添加"FF FE"则记事本就知道你是UCS-2-LE编码,如果记事本前添加"FE FF"则为UCS-2-BE编码,如果记事本前面添加"EF BB BF"则为UTF-8编码。
Unicode编码误区
在和其他技术人员合作的时候,我经常问他们:“你们字符采用什么编码方式?”,很多人都回答我Unicode编码,每次听到这话我就头疼,因为Unicode编码方式太多种了,你指的究竟是哪一种?久而久之发现,他们都认为Unicode是一种编码格式,而非字符集。我觉得这种误区是很有必要摆脱的。
结束
如果这篇文章能稍微帮助你了解编码,那么我很开心。同时,再次重复一下,若有错误或者疑问的地方,希望能耽误你的一点时间,在评论区留下宝贵的见解。
最后
以上就是丰富店员为你收集整理的聊聊编码格式的全部内容,希望文章能够帮你解决聊聊编码格式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复