要想弄清楚char类型,就必须了解unicode编码机制。

在unicode出现之前,已经有了很多不同的标准,比如美国的ASCⅡ,西欧的ISO8859-1,中国的GB18030等。但是没有一个统一的编码机制,那么对于一个任意给定的字符值,在不同的编码方案下就可能对应不同的字母。设计Unicode编码的目的就是要解决这些问题。

这里我们将讲一下两种常用的unicode编码方式,分别为utf-8与utf-16。

对于utf-8来说,其编码占用的空间为1到4个字节。这就产生了一个最显而易见的问题,既然一个字符可以占用1个字节来表示,也可以占用多个字节,那怎么让计算机来进行识别呢?

utf-8的编码规则巧妙地解决了这个问题:

1.对于一个字节,将最高位设置为0,剩余的七位用来编码字符,而这种情况下与我们常见的ASCⅡ编码完全一致。

2.对于需要n个字节来编码字符的情况,第一个字节的前n位设为1,第n+1位设置为0,剩余字节的前两位均设置为10。这里以四个字节为例,则可以表示为11110xxx  10xxxxxx  10xxxxxx  10xxxxxx

在这里我们以汉字“汉”为例来演示utf-8是如何进行编码的。

首先,“汉”的码点是0x6c49(码点是指与一个编码表中某一个字符对应的代码值),转为2进制为0110  1100  0100  1001,根据上表的码点范围,我们可以得知按utf-8的方式进行编码“汉”字的编码格式为1110xxxx  10xxxxxx  10xxxxxx

将“汉”的二进制码点从低位填充,不足的补零,即可得到“汉”的utf-8编码为11100110  10110001  10001001

接下来,我们来看看utf-16编码方式,在Unicode标准中,码点采用十六进制书写,并且加上前缀U+,整个码点的范围为U+0000到U+10FFFF。

在了解 UTF-16 编码方式之前,先了解一下另外一个概念——“平面”。

Unicode 可以看做是一本很厚的字典,她将全世界所有的字符定义在一个集合里。这么多的字符不是一次性定义的,而是分区定义。每个区可以存放 65536 个(2^16)字符,称为一个平面(plane)。目前,一共有 17 个(2^5)平面,也就是说,整个 Unicode 字符集的大小现在是 2^21。

最前面的 65536 个字符位,称为基本平面(简称 BMP ),它的码点范围是从 0 到 2^16-1,写成 16 进制就是从 U+0000 到 U+FFFF。所有最常见的字符都放在这个平面,这是 Unicode 最先定义和公布的一个平面。剩下的字符都放在辅助平面(简称 SMP ),码点范围从 U+010000 到 U+10FFFF。

基本了解了平面的概念后,再说回到 UTF-16。

它的编码规则很简单:基本平面的字符占用 2 个字节,辅助平面的字符占用 4 个字节。也就是说,UTF-16 的编码长度要么是 2 个字节(U+0000 到 U+FFFF),要么是 4 个字节(U+010000 到 U+10FFFF)。那么问题来了,当我们遇到两个字节时,到底是把这两个字节当作一个字符还是与后面的两个字节一起当作一个字符呢?

这里有一个很巧妙的地方,在基本平面内,从 U+D800 到 U+DFFF 是一个空段,即这些码点不对应任何字符。因此,这个空段可以用来映射辅助平面的字符。

辅助平面的字符位共有 2^20 个,因此表示这些字符至少需要 20 个二进制位。UTF-16 将这 20 个二进制位分成两半,前 10 位映射在 U+D800 到 U+DBFF,称为高位代理码点(H),后 10 位映射在 U+DC00 到 U+DFFF,称为低位代理码点(L)。这意味着,一个辅助平面的字符,被拆成两个基本平面的字符表示。

因此,当我们遇到两个字节,发现它的码点在 U+D800 到 U+DBFF 之间,就可以断定,紧跟在后面的两个字节的码点,应该在 U+DC00 到 U+DFFF 之间,这四个字节必须放在一起解读。

接下来让我们通过实例来看一下utf-16是如何进行编码的。

①、将辅助字符的码点值减去0x10000,得到一个20位长的二进制数

②、将得到的20位长二进制数拆分为高10位比特和低10位比特

③、20位长的高10位比特加上0xD800得到第一个代理码点,即高代理码点

④、20位长的低10位比特加上0xDC00得到第二个代理码点,即低代理码点

⑤、将得到的高代理码点和低代理码点组合成“代理对”,便得到了增补字符的UTF-16编码

⑥、示例:求辅助平面码点值为U+10437的UTF-16编码

将0x10437减去0x10000,得到0x00437,二进制为0000 0000 0100 0011 0111

将高10位,即0000 0000 01加上0xD800(二进制为1101 1000 0000 0000),得到高代理码点为:0xD801(二进制为1101 1000 0000 0001)

将低10位,即00 0011 0111加上0xDC00(二进制为1101 1100 0000 0000),得到低代理码点为:0xDC37(二进制为1101 1100 0011 0111)

将高代理码点和低代理码点组合成代理对得到UTF-16编码为0xD801 DC37

浅谈unicode编码相关推荐

  1. 浅谈Base64编码算法

    一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ...

  2. 浅谈Base64编码[转]

    问题来源 使用方法Convert.ToBase64String时候不知所以然. 所以在网上查了点资料: 浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网 ...

  3. 浅谈Base64编码

    浅谈Base64编码  我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Ema ...

  4. 浅谈文字编码和Unicode(下)[转]

    3 字符编码模型 程序员经常会面对复杂的问题,而降低复杂性的最简单的方法就是分而治之.Peter Constable在他的文章"Character set encoding basics U ...

  5. 浅谈 UTF-8 编码

    ASCII.GBK.Unicode 与 UTF-8 在计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有 0 和 1 两种状态,因此八个二进制位就可以组合出 256 种状态,这被称为 ...

  6. 浅谈Java编码规范,养成良好习惯!

    编程最害怕的是出现 bug,满屏的报错让我们的大脑嗡嗡直响,不好的编码习惯也会让其他人无从下手,所以良好的编码习惯不仅可以让我们尽量少的出错,也可以让他人清明的看懂自己写的代码.本篇主要分为三个部分: ...

  7. 浅谈Base64编码规则

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,在了解Base64编码之前,先了解几个基本概念:位.字节. 位:"位(bit)"是计算机中最小的数据单位.每一位 ...

  8. JackHttp -- 浅谈编码、加密(对称加密,非对称加密,Hash算法)

    如果你还不清楚 JackHttp 是什么,请戳这里!!! JackHttp 是一个网络框架系列,为什么还要分享编码和加密呢?主要有如下几个原因: HTTP 在网络传输过程中是明文的. HTTP 在网络 ...

  9. Unicode编码 【转】

    转自:http://blog.csdn.net/fmddlmyy/article/details/1510193 浅谈文字编码和Unicode(上) 我曾经写过一篇<谈谈Unicode编码,简要 ...

最新文章

  1. mSystems:南京土壤所禇海燕组受邀发表微生物生物地理学综述(官方配视频简介)
  2. 2017年中国人工智能产业最全研究报告发布 | AI世界2018年八大趋势
  3. J20170524-hm
  4. Ado.net 创建DataTable
  5. 04_Flink-HA高可用、Standalone集群模式、Flink-Standalone集群重要参数详解、集群节点重启及扩容、启动组件、Flink on Yarn、启动命令等
  6. OleDbCommandBuilder 使用方法
  7. java的IO知识梳理
  8. 服务器虚拟化 远程,服务器虚拟化 远程
  9. css3圆形修边按钮
  10. layer 刷新某个页面
  11. 数据库习题(填空题五)
  12. concurrent.futures:线程池,让你更加高效、并发的处理任务
  13. MATLAB中dither抖动函数的用法
  14. 第三届中国CEO新年峰会参会感想二
  15. 大作都是怎么诞生的,游戏开发全过程揭秘 !零基础小白入门须知
  16. Stardust 案例:制作散景光斑
  17. 【报告分享】2021年网生代线上社交行为洞察报告-Mob研究院TT语音(附下载)
  18. 如何在安装 Enscape渲染器时禁用或启用弹出窗口
  19. linux 的常用命令---------第十阶段(虚拟机三种网络模式)
  20. 华为分布式文件存储服务器配置,分布式存储服务器

热门文章

  1. 什么样的显示器才是玩家最爱?AGON爱攻用三年给出了答案
  2. Matlab:生成不同的随机数
  3. JavaScript(十九)飞机大战demo
  4. WM_CLOSE、WM_DESTROY、WM_QUIT, SENDMESSAGE ,POSTMESSAGE
  5. Ubuntu入门编写
  6. 华为scp快充协议详解_带有USB-C支持SCP的移动电源可以为华为手机提供SCP快充么?答案在这里...
  7. 谷歌浏览器的防火墙怎么关闭?
  8. ABB喷涂机器人IRC5P通讯关联程序号启动,profinet
  9. R语言字符串拼接(paste()函数)
  10. 网络爬虫正成为中国私募机构获取超额收益的下一个来源