文档章节

Unicode与UTF-8

老菜鸟0217
 老菜鸟0217
发布于 2016/11/04 01:05
字数 602
阅读 37
收藏 0

Unicode与UTF-8的区别

Unicode是一个字符集,为了保证全球各个国家的字符都能有唯一的二进制码。

UTF-8 是 Unicode 字符集的一种编码实现方式,比如:

字符 Unicode  UTF-8                         
A 00000000 01000001       (16进制:0041 ) 01000001
01001110 00101101       (16进制:4E2D ) 11100100 10111000 10101101

那么疑问来了,Unicode已经统一了全球字符,为啥还需要UTF-8呢?

我们说Unicode字符“通常”只有2个字节,但Unicode的字节长度是可以扩展的,以支持那些还未出生的字符(如果将来发现火星上也有人类并且想和我们交流),因此在编码时,单纯地使用Unicode字符集的原始值,就会出现在解码的时候,不知道一次得截取几个字节来翻译成字符,比如6个字节的字符串,它到底是几个字符呢,可能3个,也可能2个。

于是乎,在使用Unicode字符集时,采取一种策略来支持可变长度字节的识别就成了一个刚需,这个时候UTF-8这种编码方式就粉墨登场了,基于Unicode字符集,通过特殊的“前缀码”来规定一个字符需要占用几个字节,恰好这个策略也完美兼容了单字节的Ascii码。

Unicode —>UTF-8 转换的规则如下:

Unicode(16进制) UTF-8 字节流(2进制)
00000000 - 0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
00200000 - 03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
04000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

字符“A” 的16进制为0041,在00000000 - 0000007F区间,所以编码之后为1个字节。

字符“中”的16进制为4E2D,在00000800 - 0000FFFF区间,所以编码之后为3个字节。

假如解码时,遇到以下字节串:

01000001    11100100 10111000 10101101  

对于UTF-8来说,是这样完成的:

1,按顺序,先遇到第1个字节01000001,因为第1位二进制码是0,于是根据规则,断定当前字符的编码是1个字节,然后取出Unicode值1000001,翻译出字符“A”;

2,接着走,再遇到第2个字节11100100,因为前4位二进制码是1110,于是根据规则断定当前字符的编码是3个字节,匹配 1110xxxx 10xxxxxx 10xxxxxx后,取出Unicode值为 01001110  00101101,翻译出字符“中”;

© 著作权归作者所有

上一篇: Centos下安装Python3
下一篇: 初学Redis
老菜鸟0217
粉丝 47
博文 82
码字总数 40887
作品 0
海淀
程序员
私信 提问
转-How to Use UTF-8 with Python

from: http://www.evanjones.ca/python-utf8.html Tim Bray describes why Unicode and UTF-8 are wonderful much better than I could, so go read that for an overview of what Unicode i......

玉龙
2012/03/16
0
0
字符编码问题:Unicode 和 UTF-8

Unicode Unicode 是一种编码,它将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码。这样乱码问题就会消失。这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码...

cooffeelis
2017/11/18
0
0
好程序员web前端分享HTML字符集

如需正确地显示 HTML 页面,浏览器必须知道使用何种字符集。 万维网早期使用的字符集是 ASCII。ASCII 支持 0-9 的数字,大写和小写英文字母表,以及一些特殊字符。 由于很多国家使用的字符并...

好程序员IT
05/14
0
0
【转】python中文decode和encode转码

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。...

寂寞的远行者
2012/07/20
0
0
三种常见字符编码简介:ASCII、Unicode和UTF-8

三种常见字符编码简介:ASCII、Unicode和UTF-8 什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个...

搬砖男神
2018/01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android双向绑定原理简述

Android双向绑定原理简述 双向绑定涉及两个部分,即将业务状态的变化传递给UI,以及将用户输入信息传递给业务模型。 首先我们来看业务状态是如何传递给UI的。开启dataBinding后,编译器为布局...

tommwq
今天
2
0
Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
6
0
CentOS 的基本使用

1. 使用 sudo 命令, 可以以 root 身份执行命令, 必须要在 /etc/sudoers 中定义普通用户 2. 设置 阿里云 yum 镜像, 参考 https://opsx.alibaba.com/mirror # 备份mv /etc/yum.repos.d/CentO...

北漂的我
昨天
3
0
Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部