转自: http://www.cnblogs.com/dragon2012/p/5020259.html

UTF-16是Unicode字符集的一种转换方式,即把Unicode的码位转换为16比特长的码元串行,以用于数据存储或传递。UTF-16编码规则如下:

2.2.1 从U+D800到U+DFFF的码位(代理区)

因为Unicode字符集的编码值范围为0-0x10FFFF,而大于等于0x10000的辅助平面区的编码值无法用2个字节来表示,所以Unicode标准规定:基本多语言平面内,U+D800..U+DFFF的值不对应于任何字符,为代理区。因此,UTF-16利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。

但是在使用UCS-2的时代,U+D800..U+DFFF内的值被占用,用于某些字符的映射。但只要不构成代理对,许多UTF-16编码解码还是能把这些不符合Unicode标准的字符映射正确的辨识、转换成合规的码元. 按照Unicode标准,这种码元串行本来应算作编码错误.

2.2.2 从U+0000至U+D7FF以及从U+E000至U+FFFF的码位

第一个Unicode平面(BMP),码位从U+0000至U+FFFF(除去代理区),包含了最常用的字符。UTF-16与UCS-2编码在这个范围内的码位为单个16比特长的码元,数值等价于对应的码位。BMP中的这些码位是仅有的码位可以在UCS-2被表示。

2.2.3 从U+10000到U+10FFFF的码位

辅助平面(Supplementary Planes)中的码位,大于等于0x10000,在UTF-16中被编码为一对16比特长的码元(即32bit,4Bytes),称作 code units called a 代理对(surrogate pair),具体方法是:

Ø 码位减去0x10000, 得到的值的范围为20比特长的0..0xFFFFF(因为Unicode的最大码位是0x10ffff,减去0x10000后,得到的最大值是0xfffff,所以肯定可以用20个二进制位表示),写成二进制形式:yyyy yyyy yyxx xxxx xxxx。

Ø 高位的10比特的值(值的范围为0..0x3FF)被加上0xD800得到第一个码元或称作高位代理(high surrogate), 值的范围是0xD800..0xDBFF。由于高位代理比低位代理的值要小,所以为了避免混淆使用,Unicode标准现在称高位代理为前导代理(lead surrogates)。

Ø 低位的10比特的值(值的范围也是0..0x3FF)被加上0xDC00得到第二个码元或称作低位代理(low surrogate), 现在值的范围是0xDC00..0xDFFF。 由于低位代理比高位代理的值要大,所以为了避免混淆使用,Unicode标准现在称低位代理为后尾代理(trail surrogates)。

Ø 最终的UTF-16(4字节)的编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。

按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个WORD,第一个WORD的高6位是110110,第二个WORD的高6位是110111。可见,第一个WORD的取值范围(二进制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二个WORD的取值范围(二进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。上面所说的从U+D800到U+DFFF的码位(代理区),就是为了将一个WORD(2字节)的UTF-16编码与两个WORD的UTF-16编码区分开来。

由于高位代理、低位代理、BMP中的有效字符的码位,三者互不重叠,搜索是简单的: 一个字符编码的一部分不可能与另一个字符编码的不同部分相重叠。这意味着UTF-16是自同步(self-synchronizing):可以通过仅检查一个码元就可以判定给定字符的下一个字符的起始码元。 UTF-8也有类似优点,但许多早期的编码模式就不是这样,必须从头开始分析文本才能确定不同字符的码元的边界。

由于最常有的字符都在基本多文种平面中,许多软件的处理代理对的部分往往得不到充分的测试。这导致了一些长期的bug与潜在安全漏洞,甚至在广为流行得到良好评价的应用软件

转载于:https://www.cnblogs.com/jhj117/p/5543121.html

转: utf16编码格式(unicode与utf16联系)相关推荐

  1. notepad++添加HEX插件,编辑歌曲ID3信息,UTF8,UTF16 encoded Unicode,添加U2020字符方法

    介绍 notepad++的插件HEX,可编辑歌曲的ID3 tag信息,包括Album.Artist.Track信息. 现象 信息歌曲的ID3信息时,受操作系统影响.最好使用notepad++,直接编辑 ...

  2. Unicode(UTF-8, UTF-16)令人混淆的概念 和 python unicode转中文及转换默认编码

    Unicode(UTF-8, UTF-16)令人混淆的概念 [转载](https://www.cnblogs.com/fnlingnzb-learner/p/6163205.html) 为啥需要Uni ...

  3. 统计“3_人民日报语料”文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式

    统计"3_人民日报语料"文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式; 首先,统计文件的字符数,有两种方法.第一种是将文件复制到w ...

  4. Unicode(UTF-8, UTF-16)令人混淆的概念

    为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的, ...

  5. unicode,UTF-8,UTF-16,UTF-32是什么,各有什么关系

    1.Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码 ...

  6. Unicode, UTF8, UTF16, UTF32

    Unicode, UTF8, UTF16, UTF32之间的关系 Unicode是编码字符集,而UTF-8, UTF-16, UTF-32是字符集编码. Unicode用一些基本的保留字符制定了三套编 ...

  7. Unicode(UTF-8, UTF-16)的简单理解

    文章目录 一.Unicode出现的意义 1)背景 2)发展起源ASCII码 3)ASCII码的缺点和优点 4) Unicodey出现的意义 二.Unicode详细介绍 0)Unicode定义 1)涉及 ...

  8. 大端小端,ascii,unicode,utf8,utf16,utf32,gb2312,gbk,gb18030等字符编码问题

    字符编码的问题让我困惑了好久的一段时间,其实简单的想,字符编码没有什么东西的,可是想真弄明白还是花去了我一点时间,前端时间写了一个简单的log程序,主要的工作就是支持系统运行时输出日志信息,同时允许定 ...

  9. Swift 【帮助你更好的了解 Swift 的字符编码格式 - Unicode Scalars】

    几句琐碎 笔者在平时码代码的过程中,一般而言只在 String 这个类的层面去做事情,脑子里还有个 Character 类的印象,但平时用的极少.以至于 Character 类及其底层是怎样实现的,就 ...

  10. java乱码 java使用的编码是utf-8还是utf-16还是unicode

    简单介绍编码 Unicode:是容纳世界所有文字符号的国标标准编码,使用四个字节为每个字符编码 UTF:是英文 Unicode Transformation Format 的缩写,意为把 Unicod ...

最新文章

  1. 隐马尔科夫模型HMM(一)HMM模型
  2. 数组第一个值_Excel公式技巧69:查找第一个非空值
  3. MUI+H5手机上传照片 支持多图片上传和拍照上传
  4. windows 7 netsh wlan命令连接wifi
  5. 图书馆占座系统(七)
  6. lammps教程:Ovito中多晶不同颜色显示技巧
  7. 【千律】OpenCV基础:图像边缘检测 -- Laplacian 算子和 LoG 算子
  8. 阿米洛键盘取消win_阿米洛键盘驱动|阿米洛樱花键盘驱动下载v1.0官方版 - 欧普软件下载...
  9. RouterOS(ROS)设置动态域名(DDNS)
  10. python连接高斯数据库_高斯数据库 (gaussDB) - 连接数据库(6)
  11. 学影视模型与游戏模型哪个更有前景呢?
  12. Excel技巧 - 长数字串如何筛选重复项
  13. 计算机系统结构——量化研究方法(第三版)
  14. 软件设计师下午真题及参考答案
  15. 软件包 jdk1.8-2000:1.8.0_281-fcs.aarch64 是针对 different 构架的
  16. 字符串类型的算法面试
  17. 目前绝大多数处理语言先验性文章总结
  18. final修饰符,修饰的变量、方法、类、还有一些相关注意事项
  19. 《调色师手册:电影和视频调色专业技法(第2版)》——往返工作流程(Round-Trip workflows)...
  20. 动态规划之背包问题——01背包

热门文章

  1. 想做视频号,先纠正一点
  2. 厉害了,苹果爸爸承认让旧 iPhone 变慢!
  3. 【自动化__持续集成】___java___代码非空指针
  4. jquery中的ajax方法详解
  5. Django Navi 重用
  6. 各种学习网站博客汇总(持续添加中。。。)
  7. J2SE基础夯实系列之正则表达式Java
  8. 新窝开张,自己祝贺一下。
  9. iOS:NO suitable application records were found.Verify your bundle identifier 'com***'is correct
  10. INSERT INTO SELECT 语句