美文网首页
谈谈对Unicode和UTF8的理解

谈谈对Unicode和UTF8的理解

作者: 三个程序员之一 | 来源:发表于2023-05-29 09:56 被阅读0次
    之前一直搞不懂 gb2312 gbk ASCII utf8 utf32 这些7788的东西。
    现在我谈一下对他的理解。
    因为计算机底层是01010101010这种的2进制存储,所以你存储的时候怎么把这种01010的二进制在转换的时候变成中文或英文还有一些表情或则+-乘除这些符号呢。
    
    其实这个就是字符集通俗讲就是2进制的不同位代表的每个中文或英文这些东西
    
    比如1个字节8位
    假如0000 0001  代表 中文  我 
    0000 0002  代表中文 爱
    那么计算机底层就会存储
    
    00000001  00000002  就是  我爱 就可以翻译过来了 空格为了方便查看 但是 但是  这是我独家定义的对应关系 
    实际上ASCII  和  gbk  gb2312  Unicode 都是分别定义了 这种关系就是这个意思 他们是一类的 都叫字符集
    这个时候有人说gbk不是编码格式么 下面会讲解
    
    ASCII  这个玩意是最早出来的字符集 他都是英文字母和基本符号 因为英文没多少字母所以 1个字节就搞定了对应关系
    但是中国文字多 中国又定义了一份 gb2312 用了2个字节  也就是65535 可以标识大多数中文   所以又出现一个字符集
    
    然后 后期gbk是对 gb2312的升级 加入了 日语韩语  好像也是2个字节 这个我没太详细去查询
    还有其他的字符集香港自己的字符集
    
    这么多字符集所以存的都是0100110101010这种2进制 但是不同字符集对应的 含义肯定不完全相同所以需要一个统一的字符集 这个时候 出现了 unicode   就是它统一了字符集 
    
    所以unicode可以标识任何的你想标识的中文英文符号其他语言等等。
    说到这里字符集应该说明白了
    
    下面讲讲为什么需要utf8这个东西
    还是拿我上面讲的独家对应关系举例子 
    假如0000 0001  代表 中文  我 
    0000 0002  代表中文 爱
    那么计算机底层就会存储
    00000001  00000002  就是  我爱    
    空格是为了阅读的你方便区分 那如果 计算机底层没有空格他怎么区分呢
    前面说中文太多  1个字节肯定表示不够用    那么可能 你字  这个中文  需要2个字节表示 如下
    0000000100000002           
    那么我爱你就表示成  00000001 00000002  0000000100000002
    我加了空格可能你可以看得懂计算机底层没空格  那么这段可以解释成  我爱你 也可以解释成 我爱我爱
    因为上面我是00000001 00000002  0000000100000002 这样断句的 如果 我改成
    00000001 00000002  00000001 00000002 这样断句是不是 就是我爱我爱了 
    计算机底层存储可以理解为 00000001000000020000000100000002 所以你不告诉他怎么断句它也不知道
    
    utf8就是为了解决 unicode存储可能出现歧义出现的 一种编码格式。
    说到这里 如果你能豁然开朗请给我个赞 然后接着看。
    
    为什么说utf8这么受欢迎因为 他是可变长度的 怎么理解呢 看下面
    
    Unicode编码   UTF-8编码(二进制)
    U+0000 – U+007F            0xxxxxxx
    U+0080 – U+07FF           110xxxxx 10xxxxxx
    U+0800 – U+FFFF           1110xxxx 10xxxxxx 10xxxxxx
    U+10000 – U+10FFFF    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    
    最开始我看到这个一脸懵逼,网上好多文章讲这个规则但是我总是get不到点 
    utf8 编码方式 是对 unicode字符集的一个存储到计算机2进制的实现 
    unicode表示那么多字符了 肯定有 00000001就可以表示的    也有 011111110000110000100多个字节表示的字符
    utf8规定了4个范围 就是上面的对照图  你看到 上面图中1110xxxx  11110xxx 110xxx 0xxx不知道你发现规律没有
    实际上这些就是为了让计算机底层可以对2进制进行区分当发现0开头的字节 就读1个字节就翻译 
    当发现110开头的字节就读两个字节就翻译   1110 11110依次类推 所以计算机底层就知道了读多少字节翻译对应字符了 就不会出现 我爱你  变成我爱我爱了
    
    为什么规定了4个范围就是为了 unicode 表示少的时候省点空间 所以根据前面的区间 放对应的数据到后面xxxx中前面0 110  1110 11110 都是固定的 为了让计算机底层断句用的 类似我给你 敲的空格 如果utf8你搞明白了  
    
    unicode肯定有对应的换算成2进制的数  对应的向满足区间的utf8的那些xxxx中去填就行了  然后会得到新的2进制值这个时候就是utf8的编码值
    
    
    下面说说gbk编码 你有的时候也会写成gbk编码 刚刚我说他不是 字符集么 ,他确实是字符集,但是他定长了啊  他规定2个字节 翻译一次  即使 是 00000001   也存成00000000 00000001  所以就是空间浪费 但是不会歧义  
    所以他也是编码格式。
    utf32也是定长 ,但是他不是字符集 他是实现方式对unicode的实现方式 对比utf8缺点就是空间浪费 所以不常用。
    讲完了希望我的 通俗讲解对你有帮助。
    

    相关文章

      网友评论

          本文标题:谈谈对Unicode和UTF8的理解

          本文链接:https://www.haomeiwen.com/subject/msjjedtx.html