沙滩星空的博客沙滩星空的博客

ASCII,Unicode 和 UTF-8的关系 - 一个汉字到底占几个字节

ASCII 编码

我们都知道一个字节有8位,转换为二进制的话,可以表示256个数,也就是从00000000到11111111。

早期人们用8位二进制来编码英文字母,因为最前面的一位统一规定为0,所以总共可以表示128个字符。

ASCII码一共规定了128个字符的编码,比如空格space是32(二进制为0010000),大写的字母A是65。这128个符号还包含着32个不能打印出来的控制符号。

1个ASCII码占1字节

ASCII码的乱码问题

在美国,这128是够了,但是其他国家不够. 为了保持与ASCII码的兼容性,一般最高位为0时和原来的ASCII码相同,最高位为1的时候,各个国家自己给后面的位(1xxx xxxx)赋予他们国家的字符意义。

这就成了不同国家有不同国家的编码方式,所以如果给你一串二进制数,想要解码,就必须知道它的编码方式,不然就会出现我们有时候看到的乱码

Unicode

Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。例如:“马”的Unicode是U+9A6C。

Unicode出现的问题

Unicode 是一种规定,本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。

有的人会说了,那我可以直接把Unicode编号直接转换成二进制进行存储,是的,你可以,但是这个就需要人为的规定了,而Unicode并没有说这样弄,因为除了这种直接转换成二进制的方案外,还有其他方案,主要有UTF-8,UTF-16,UTF-32。(UTF-8、UTF-16、UTF-32……都是 Unicode编码 的一种实现。)

比如说汉字严的unicode编码为4E25,转化为二进制代码足足有15个比特位来保存,当然对于更大的字符,可以使用三个字节或者四个字节来保存。此时我们如何来区分unicode和ASCII?因为对于一个unicode我们可以将其看做两个,三个或者四个ASCII编码。我们此时如何区分呢?如果我们将全部的编码按照最大位数来进行编码,则对于ASCII的前面几个字节都是0,造成资源浪费。

UTF-8

UTF-8是Unicode的实现方案之一,是一种变长的编码方式,即可以表示的字节范围是:一个字节到四个字节。

UTF-8编码规范:

  1. ASCII码使用一个字节表示,首位为0。比如说a的UTF-8的编码为01100001。对于英文字母,UTF-8编码和ASCII码相同。
  2. 对于非ASCII编码使用多个字节来表示,并且第一位的(从左向右数)开头几个1,表示几个字节,并且剩余的字节都以10开头。
    举一个例子:严的Unicode是4E25(100111000100101),4E25需要三个字节保存,所以开始位置为1110xxxx 10xxxxxx 10xxxxxx,然后从后往前开始,依次将100111000100101填入其中,所以最终严对应的UTF-8的值表示为:11100100 10111000 10100101,十六进制为:E4B8A5。

UTF8 占用字节

少数汉字(常用汉字)每个占用 3 个字节,多数占用 4 个字节。

  • 占 1 字节: 数字,英文字母...
  • 占 2 字节:〇
  • 占 3 字节:基本等同于 GBK,含 21000 多个汉字
  • 占 4 字的:中日韩超大字符集里面的汉字,有 5 万多个

字符编码笔记:ASCII,Unicode 和 UTF-8 http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
Unicode与UTF-8的区别 https://blog.csdn.net/qq_36761831/article/details/82291166
utf-8 中的一个汉字占几个字节 https://blog.csdn.net/kodeyang/article/details/12885263
一文详解ASCII码,Unicode与utf-8 https://blog.csdn.net/qq_55752792/article/details/125603575
未经允许不得转载:沙滩星空的博客 » ASCII,Unicode 和 UTF-8的关系 - 一个汉字到底占几个字节

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址