• 对ASCII、GB2312、Unicode、UTF-8的理解


    ASCII:美国标准信息交换代码,用一个字节来表示,每个数字对应一个字符,类似于对应表,操作系统根据数字来显示对应的字符,美国只用了0-127

    GB2312:由于汉字太多了,一个字节不够用,咱们就学ASCII自己定了一套编码库,收录了咱们常用的汉字和部分其他文字

    Unicode:世界上还有很多国家民族也要在计算机中显示自己的文字,于是大家就各自弄了一套自己的字符集,比如中国大陆的GB2312,这样的话,冲突在所难免,所以国际上就弄了个统一的Unicode,把所有的文字包括进去并且保证不冲突,Unicode本质上也是一个对应表,最开始是2个字节,最多表示65536个字符,范围0x00-0xFFFF,后来进行了扩展,变成了0x00-0x10FFFF,现在能表示17*65536=1114112个字符,基本上把世界上所有的文字都包括进去了

    UTF-8:Unicode的范围是0-1114112,这就出现一个问题,英文字母由于比较少再加上计算机起源美国,所以美国人一般只用到0-127,0-127用一个字节就能表示,而汉字由于比较多,再加上很多繁体字生僻字编码比较靠后,很多都是3字节甚至4个字节,当我们保存Unicode字符集的字符串数据时,就要考虑用几个字节来表示,如果用1个字节的话,汉字就没法保存了,如果用4个字节的话,英文就大大的浪费了,所以UTF-8就出现了,它则是基于Unicode字符集的一种编码实现,大致思路是在二进制位中标记共有几个字节,并将原Unicode的字节填充进去,这样就能用一个字节来保存英文字母和数字,用3-4个字节来保存中文了,规则如下:

    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

    2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码

    最终的UTF-8模型如下,其中x用来填充Unicode码,首字节开头的1用来标记有几个字节,0后面的是数据,非首字节开头用10来标记,后面也是数据

    1个字节,则0xxx xxxx
    2个字节,则110x xxxx 10xx xxxx
    3个字节,则1110 xxxx 10xx xxxx 10xx xxxx
    4个字节,则1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx

    将UTF-8中除x外的固定位移除再连接起来就是Unicode码了

    GBK:GBK是GB2312的扩展,GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物

    GB18030:对GB23120完全向后兼容,与GBK基本向后兼容,并支持Unicode(GB 13000)的所有码位

    UTF-16:Unicode的另一种编码方式,不过不常用

    --------------个人的粗浅理解,可能有不准确的地方---------------

  • 相关阅读:
    c# 构架WPF 纸牌游戏(斗地主2)
    超级灰色按钮克星更新v1.3.1112.40
    早期绑定、动态绑定、后期绑定
    反射、反射加壳、反射脱壳、反射注册机(上)
    c# 构架WPF 纸牌游戏(斗地主4)
    Google首页吃豆游戏完整源码下载,以及声音问题的解决
    c# 构架WPF 纸牌游戏(斗地主1)
    c# 构架WPF 纸牌游戏(斗地主3)
    反射、反射加壳、反射脱壳、反射注册机(下)
    未能加载文件或程序集一例
  • 原文地址:https://www.cnblogs.com/luludongxu/p/13848175.html
Copyright © 2020-2023  润新知