计算机中的所有字符,说到底都是用二进制的0、1的排列组合来表示的,因此就需要有一个规范,来枚举规定每个字符对应哪个0、1的排列组合,这样的规范就是字符集

ASCII

全称是“美国信息交换标准码”(American Standard Code for Information Interchange),制定于20世纪60年代,这套规范规定了128个字符对应的二进制码。128=27,即只需要7个bit就能完全表示,因此每个ASCII码只需占用1个字节(1Byte = 8bit)。

例如,大写字母A对应ASCII编码是01000001。点击查看完整的ASCII码表

假如一个文本文件存放了100个ASCII编码的字符,那么这个文件内容的大小就是100B。

ASCII规范只涵盖了英文字母、数字和一部分符号(包括换行符、制表符等控制性符号),但世界上还有许多语言的字符需要能够被计算机系统处理(比如几万个汉字),这样一来就需要制定一个比ASCII大得多的字符集,足够把全世界所有字符都囊括进去。这个字符集就是Unicode。

Unicode

这是全世界最大的字符集,相对于ASCII码,Unicode大大扩展了编码位数到16 - 32位,意味着它理论上最多可以容纳 232≈42亿 个字符。Unicode包含了各种字母、中日韩文字、emoji等几乎所有语言和领域的符号,如汉字“我”对应的Unicode是01100010 00010001,写成16进制就是6211。现在互联网上传递、展示所使用的编码基本都是Unicode。它的最低7位与ASCII码是完全兼容的,即如果用16位Unicode来表示大写字母A,就会写成00000000 01000001。

UTF-8

Unicode覆盖面很广,但如果一定要用16乃至32位来存储和传输每个符号,对于主要使用ASCII码的西方用户,势必会出现大量仅仅用于补位的0位,造成硬件资源浪费。为此,人们发明了UFT-8编码,使用可变的位数来表示Unicode里的字符。

UTF-8是怎么做的呢?

1.  对于单字节就可表示的字符,第一位为0,后面7位为该字符的ASCII码

2. 对于需要≥2个字节才可表示的字符,第一个字节以1开头,且该字符总共占了几个字节,就插入几个连续的1;连续的1结束后,插入一个0。后续字节全部以01开头。

如下表所示(表格来自阮一峰老师的博客

Unicode符号范围      |        UTF-8编码方式
(十六进制) | (二进制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

将“我”编码成UTF-8的操作方法如下:
“我”的Unicode码是6211,对应表里3字节编码的区间。在Unicode二进制码相应位置插入控制位,得到
11100110 10001000 10010001
写成16进制就是E68891,这样就得到了UTF-8编码。

当然,对于一般的开发者来说,编码细节是次要的,只要知道是怎么一回事就行了~

所以,当一个HTML页面被添加了<meta charset="utf-8">标签时,计算机就知道,每当这个页面文本的字节流里发现一个E68891,就应该把它视为“我”字。但假如页面编码时不是遵循的UTF-8,而是GB2132(它和UTF-8毫无关系),那么就会出现乱码——计算机错误解读了这些字节的意思。


【编码】彻底弄懂ASCII、Unicode、UTF-8之间的关系的更多相关文章

  1. python中,ascii,unicode,utf8,gbk之间的关系梳理

    在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...

  2. 字符编码:Unicode和UTF-8之间的关系

    Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256 ...

  3. Unicode和UTF-8之间的关系

    作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...

  4. ASCII、ANSI、GB2312、Unicode、UTF-8之间的关系

    1.ASCII码: ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统.它主要用于 ...

  5. erl0008 - unicode 和 utf-8之间的关系

    转载:http://blog.jobbole.com/84903/ 原文出处: 卢钧轶   欢迎分享原创到伯乐头条 本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧. 背景:字符集 ...

  6. unicode和utf8之间的关系

    ,字符编码是计算机技术的基石,想要熟练使用计算机,懂得一点字符编码的知识,还是很有必要的. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit ...

  7. Unicode 和 UTF-8 之间的关系

    一.ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个 ...

  8. 由Unicode编码想到弄懂编码表

    test unicode好 007400650073007400200075006E00690063006F00640065597D 这是一个Unicode编码,一共六七万的汉字,可以说Unicode ...

  9. ASCII UNICODE UTF "口水文"

    最近接了一个单是需要把非 UTF-8 (No BOM)编码的文件转换成 UTF-8 (No BOM),若此文件是 UTF-8 但带有 BOM ,需要转换成不带 BOM 的.于是开启了一天的阅读.首先花 ...

随机推荐

  1. Bash Shell编程简记

    Shell编程简记 经常在linux环境下开发的同学,难免要使用shell的一些命令或者编写小的脚本,我这里也总结和整理下,自己对Shell的理解和常用的一些shell脚本. 按照目录分为如下3个节: ...

  2. centos7忘记root密码的重置方法-超简单

    忘记root密码,重置root密码8步. 1.在开机界面按e进入grub编辑模式 2.找到 ro修改为rw /sysroot/bin/sh 3.Ctrl + x 启动 4.chroot /sysroo ...

  3. String类中常用的方法

    @Test public void demo(){ // 以下为String中的常用的方法及注释, 最常用的注释前有**标注 String s = "abcdefg123456"; ...

  4. 关于servlet报错和jsp中报关于servlet的错误

    servlet-api是对servlet的支持,如果你导入别人的项目后出现servlet中的导包处出现关于javax.servlet.的错误,那么就是缺少这个包了.还有对jsp页面中的报错的支持. 下 ...

  5. js中跳转的方法

    javascript中的location.href有很多种用法,主要如下. self.location.href="/url" 当前页面打开URL页面location.href=& ...

  6. mysql那些事(6) WHERE条件 字符串的引号

    前言:所谓的坑,两个意思,一个是软件本身的bug,一个是使用者常犯的错误. phper在日常开发中经常和mysql打交道.特别是在没有分层的中小应用中,phper开发要关注sql语句的实现. 入正题, ...

  7. vue中的$EventBus.$emit、$on 遇到的问题

    今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...

  8. redis数据类型--set

    set是String的一个无序集合,最大存储量2^32-1(大概40多亿) 1.操作命令:(xxx可以是任意字符串) sadd xxx a b c d e (添加一个或多个) smembers xxx ...

  9. springcloud集成redis

    1.application.properties/application.yml配置: redis: # redis数据库索引(默认为0),我们使用索引为3的数据库,避免和其他数据库冲突 databa ...

  10. 压缩感知重构算法之IHT算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...