zoukankan      html  css  js  c++  java
  • Unicode 和 UTF-8 的区别

    刚接触前端时也搞不清楚<meta chartset="utf-8"> <meta chartset="gb2312">等这些到底是做什么的,各有什么优势。偶然在知乎看到了一篇文章,大致是弄懂了。

    举一个例子:It's 知乎日报
    你看到的unicode字符集是这样的编码表:

    I 0049
    t 0074
    ' 0027
    s 0073
      0020
    知 77e5
    乎 4e4e
    日 65e5
    报 62a5
    

    每一个字符对应一个十六进制数字。

    计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样存储:

    I 00000000 01001001
    t 00000000 01110100
    ' 00000000 00100111
    s 00000000 01110011
      00000000 00100000
    知 01110111 11100101
    乎 01001110 01001110
    日 01100101 11100101
    报 01100010 10100101
    

    这个字符串总共占用了18个字节,但是对比中英文的二进制码,可以发现,英文前9位都是0!浪费啊,浪费硬盘,浪费流量。

    怎么办?

    UTF。

    UTF-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
    ... ...

    于是,”It's 知乎日报“就变成了:

    I 01001001
    t 01110100
    ' 00100111
    s 01110011
      00100000
    知 11100111 10011111 10100101
    乎 11100100 10111001 10001110
    日 11100110 10010111 10100101
    报 11100110 10001010 10100101
    

    和上边的方案对比一下,英文短了,每个中文字符却多用了一个字节。但是整个字符串只用了17个字节,比上边的18个短了一点点。

    作者:uuspider
    链接:https://www.zhihu.com/question/23374078/answer/65352538
    来源:知乎

  • 相关阅读:
    Linked List Cycle leetcode java (链表检测环)
    Remove Duplicates from Sorted List II leetcode java
    Remove Duplicates from Sorted List leetcode java
    Merge Two Sorted Lists leetcode java
    Swap Nodes in Pairs leetcode java
    Median of Two Sorted Array leetcode java
    阿里云最便宜的四种域名注册
    nohup和&后台运行,进程查看及终止
    ipv6转ipv4 NAT64与DNS64基本原理概述
    ros使用pppoe拨号获取ipv6,并且下发IPV6的dns到客户机win7
  • 原文地址:https://www.cnblogs.com/dxzg/p/6423570.html
Copyright © 2011-2022 走看看