五分钟让你彻底了解Unicode/UTF-8/UTF-16/UTF-32 编码方式

声明

本文原文是英文,搬运自https://naveenr.net/unicode-character-set-and-utf-8-utf-16-utf-32-encoding/,如果网络优秀建立查看原文,本文是参照原文的翻译,如有侵权,请私信我删除,在此感谢作者透彻的讲解,与大家共同学习,共同进步!😄

正文

ASCII

在较早的计算时代,ASCII 码用于表示字符。英语只有 26 个字母和一些其他特殊字符和符号。
下表提供了 ASCII 字符及其对应的十进制和十六进制值。


image.png

从上表可以推断,ASCII 值在十进制数系统中可以表示为 0 到 127。让我们看一下 8 位字节中 0 和 127 的二进制表示。

0 表示为


127 表示为


从上面的二进制表示可以推断,十进制值 0 到 127 可以使用 7 位表示,而第 8 位是空闲的。

这就是事情开始变得混乱的地方。

人们想出了不同的方法来使用剩余的第八位,代表从 128 到 255 的十进制值,并且开始发生冲突。例如,越南人使用十进制值 182 来表示越南字母 ờ,而印度人使用相同的值 182 来表示印地语字母。因此,如果由印度人撰写的电子邮件包含字母,并且如果由越南人阅读,它将显示为。显然不是预期的出现方式。

这就是Unicode字符集来拯救这一天的地方。

Unicode 和代码点

Unicode 字符集将世界上的每个字符映射到一个唯一的数字。这确保了不同语言的字母之间没有冲突。这些数字与平台无关。

这些唯一的数字在 unicode 术语中称为代码点。

让我们看看它们是如何被引用的。

使用代码点引用 拉丁字符

U+1E4D  

U+表示 unicode,1E4D是分配给字符 ṍ 的十六进制值

英文字母A表示为U+0041

请访问http://www.unicode.org/charts/了解世界上所有语言和字母的代码点

UTF-8 编码

既然我们知道了什么是 unicode 以及世界上的每个字母如何分配给一个唯一的代码点,我们需要一种方法来表示计算机内存中的这些代码点。这就是字符编码出现的地方。一种这样的编码方案是 UTF-8。

UTF-8 编码是一种可变大小的编码方案,用于表示内存中的 unicode 代码点。可变大小编码意味着代码点根据其大小使用 1、2、3 或 4 个字节表示。

UTF-8 1 字节编码

1字节编码由第一位中存在 0 来标识。

英文字母A具有 unicode 代码点U+0041。它的二进制表示是1000001

A 在 UTF-8 编码中表示为

红色的 0 位表示使用 1 字节编码,其余位表示代码点

UTF-8 2 字节编码

带有代码点U+00F1的拉丁字母ñ具有二进制值11110001。该值大于可以使用 1 字节编码格式表示的最大值,因此该字母表将使用 UTF-8 2 字节编码表示。

2字节编码通过在第一位中存在位序列110和在第二位中存在10来识别。

unicode 代码点U+00F1的二进制值为1111 0001。以 2 字节编码格式填充这些位,我们得到ñ的 UTF-8 2 字节编码表示,如下所示。填充从将代码点的最低有效位映射到第二个字节的最低有效位开始。

蓝色的二进制数字11110001代表代码点 U+00F1 的二进制值,红色的数字是 2 字节的编码标识符。黑色的零用于填充字节中的空位。

UTF-8 3 字节编码

带有代码点U+1E4D的拉丁字符使用 3 字节编码表示,因为它大于使用 2 字节编码可以表示的最大值。

3字节编码通过在第一个字节中存在位序列1110以及在第二和第三字节中存在10来标识。

十六进制代码点0x1E4D的二进制值为1111001001101。以上述编码格式填充这些位为我们提供了的 UTF-8 3 字节编码表示,如下所示。填充从映射到第三个字节的最低有效位的代码点的最低有效位开始。

红色位表示 3 字节编码,黑色位是填充位,蓝色位表示代码点。

UTF-8 4 字节编码

Emoji 😭 具有 unicode 代码点U+1F62D。这大于可以使用 3 字节编码表示的最大值,因此将使用 4 字节编码表示。

4 字节编码由第一个字节中的11110 和随后的第二、第三和第四个字节中的10来标识。

U+1F62D的二进制表示是11111011000101101。用上面的编码格式填充这些位给我们 UTF-8 4 字节编码的😭。代码点的最低有效位映射到第四个字节的最低有效位,依此类推。

红色位标识 4 字节编码格式,蓝色位是实际代码点,黑色位是填充位。

UTF-16 编码

UTF-16 编码是一种可变字节编码方案,它使用 2 个字节或 4 个字节来表示 unicode 代码点。所有现代语言的大多数字符都使用 2 个字节表示。

带有代码点U+00F1和二进制值11110001的拉丁字母ñ在 UTF-16 编码中表示为

上面的表示是大端字节顺序模式(最高有效位在前)。

UTF-32 编码

UTF-32 编码是一种固定字节编码方案,它使用 4 个字节来表示所有代码点。

英文字母 A 具有 unicode 代码点 U+0041。它的二进制表示是1000001

它以 UTF-32 编码表示,如下所示,

蓝色位是代码点的二进制表示。以上假设大端字节顺序模式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容