编码问题:ASCII、Unicode和UTF-8

来源:互联网 发布:淘宝网地板砖 编辑:程序博客网 时间:2024/06/08 14:25
最开始计算机在使用英文的国家被发明,英文字母有限,再加上一些特殊符号,用127个8位二进制就可以表示完,这就是【ASCII码】。其中0x20以下的编码称为“控制码”,类:0x10 换行 0x07 发出蜂鸣声


后来计算机普及到世界各地,很多国家用的不是英文,于是将127号后的空位来表示其他的字母、符号,还加入了平时要用到的横线、竖线等形状,这样一直排到最后一个状态255。从128~255这一页字符集就被称为“扩展字符集”


计算机来到我大中华时,已经没有足够空余的字符来表示汉字了。于是就把127号后面的符号取消掉,规定:一个小于127的字符表示的内容不变,两个大于127的字符连在一起就表示汉字(前一个字节称为高字节从0xA1到0xF7,后一个称为低字节从0xA1到0xFE)。这些编码还把数字符号、罗马希腊字母、日本的假名都编进去了,还把原来在ASCII里的数字、符号重新编码成两个字节长的,这就是常说的【全角】字符,而原来127号以下的就叫【半角】字符。这样的汉字方案叫做【GB2312】,是对ascii的汉字扩展


在日常应用中发现中国的汉字有一本新华字典辣么多,区区几千个字符怎么表示得完,为了扩展更多的字符,规定:只要第一个字节大于127就固定表示一个汉字。这种编码被称为【GBK标准】,在GB2312的基础上扩展了20000个汉字(包括繁体字)和符号。


为少数民族的使用,加了几千个新的少数名族字,GBK扩成【GB18030


上面的汉字编码,统一称为“DBCS”(Double Byte Charecter Set双字节字符集)。

这时一个汉字算两个英文字符



—————————————————————————————————————————————————

各个地区都发明了适合自己的编码,在国际上就难以很好的交互,于是国际化标准组织(ISO)重新编排了一个编码方案,包括了地球上所有文化、所有字符和符号,这个编码叫做【UCS】"Universal Multiple-Octet Coded Character Set",俗称【unicode



unicode编码规定:所有字符都用2个字节(16位)来表示,原ascii码中的半角字符,低位不变,高8位永远是0。这样保存英文时就会浪费多一倍空间。


此时出现的问题是,怎么分辨unicode码和ascii码?还有英文存储永远都浪费了一倍的空间。


所以unicode在很长一段时间都无法推广,直到互联网出现。为解决unicode在网络传输问题,出现了众多的【UTF】(UCS Transfer Format)标准。【UTF-8】就是每次8个位传输数据,【UTF-16】就是每次16个位传输数据。


【UTF-8】就是在互联网上使用最广的一种unicode的实现方式。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
   它是一种变长的编码方式:
    1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
    2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
    这样就形成了如下的UTF-8标记位:
    0xxxxxxx
    110xxxxx 10xxxxxx
    1110xxxx 10xxxxxx 10xxxxxx
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx



原网页链接:https://www.zhihu.com/question/23374078
0 0
原创粉丝点击