由iPhone emoji牵扯出的UTF-16编码

问题

在iOS中有emoji表情,这个表情很多机器不能正常显示,笔者决心研究一下这个问题。笔者参考了几个地方:

1. 将字符串转化成unicode和utf-8的工具。点击下载

2. 维基百科utf-16 点击打开

3. 笔者博文utf-8的介绍 点击打开

比如,在输入框输入一个emoji 微笑,然后看看它的编码是什么情况:

可以看到Unicode编码是 D83D-DE03。utf-8的编码是F09F-9883.这个不寻常的,下面会介绍!

这里需要注意一下:通常utf-8是1到3个字节的,也就是说在Unicode编码空间的第0个平面上。这里有必要说明一下utf-8的编码规则(更多点击这里)如图所示:

就上面这个表格,我们举个例子:“汉”字的汉来说。它的unicode是0x6C49,utf8是0xE6B189,带入公式,发现是正确的。

我们再看看“微笑”符号的Unicode:D83D-DE03,已经超过了最大的0X10FFFF了,那么它是如何表示的呢???我们根据utf-8:F09F-9883.来反推Unicode对应的数值吧,看看究竟是为什么:

得出的结果是0x1-F603.这个结果跟Unicode:D83D-DE03的值相差太大,所以,中间肯定经过了一些转换步骤,这个转换就是utf-16的代理!!!

UFT-16

UTF是"Unicode/UCS Transformation Format"的首字母缩写,即把Unicode字符转换为某种格式之意。上面第二张图片展示的是utf-8和unicode的对应表,这只是一个简单的对应,却非常好用。

在正常情况下一个Unicode两个字节,在转化uft-8的时候,根据协议,两个两个字节,对应一个uft-8这样完成转化或者称为映射!

其实在第0个平面中,专门有一个代理区域,用于指向第1到第16个平面中的字符,这段区域是:D800——DFFF.。其中0xD800——0xDBFF是前导代理(lead surrogates).0xDC00——0xDFFF是后尾代理(trail surrogates).一个代理对儿(前导,后尾),就表示一个utf-16的字符。就那emoji的微笑来说,前导是代理:D83D;后尾代理是:DE03。根据下图可以得出utf-16的值是:0x1-F603。

这就照应上了。

作为程序员的,笔者做一个比喻:这对儿(前导代理,后尾代理)就像一个个指针,指向了第1——16平面上的每一个码位。经过计算不难得出:16个平面X每个平面码位65536 = 1,048,576个,前导X后尾也是1,048,576个。这是一个完美的解决方案!!!如上图所示。

这样做的好处是:我们根据Unicode的第一个字节来判断:

if(Unicode第一个字节 >=0xD8 && Unicode <=0xDB){
    //这是代理区域,表示第1——16平面的字符。每四个字节表示一个单元
}
else{
    //这是正常映射区域,表示第0个平面。每两个字节表示一个单元。
}

这样的结果是:根据这个协议,计算机可以知道两个字节,还是四个自己表示一个字符。

总结

这里说的utf-8和utf-16,其实本质上是一样的。只是utf-8是一个直接的映射。而utf-16需要根据代理区的(前导代理,后尾代理)来映射。utf-16比utf-8多了一步而已!

话又说回来:如果不是代理区域的出现,就emoji 微笑的unicode: D83D-DE03来说。计算机甚至不知道这是一个字符,还是两个字符?

时间: 2024-10-17 10:41:25

由iPhone emoji牵扯出的UTF-16编码的相关文章

iphone底部弹出广告条

iphone底部弹出广告条[电薇:132乄8688乄4109][Q群780516296]伊朗高层对伊核协议有分歧?哈梅内伊为此再定调莫迪推动印度武器国产化 国企不靠谱将目光转向私企在朝鲜问题上 美国为啥最近变得越发"焦躁"?今年涨得最好的3类基金:石油基金.美股基金.REITs法国为吸引中国游客费尽心思:开设专用购物中心不少父母主动支持 整容成了孩子的"开学礼物"?领奖服的变迁 民族品牌催化下中国体育的发展之路荷兰银行:鲍威尔评论偏鸽派 对美元是利空日防相巨资\&q

采用霍夫曼编码(Huffman)画出字符串各字符编码的过程并求出各字符编码 --多媒体技术与应用

题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长度,并计算出字符串位数在编码前与编码后的比值 解答: (1)各字符出现频率统计如下表所示. |符号 |出现次数 |出现频率| |--|--|--| | a |7|0.35| |b|2|0.1| |c|4|0.2| |d|4|0.2| |e|3|0.15| 编码过程如下图所示: 各字符编码如下表所示:

不起眼的 z-index 却能牵扯出这么大的学问(转)

z-index在日常开发中算是一个比较常用的样式,一般理解就是设置标签在z轴先后顺序,z-index值大的显示在最前面,小的则会被遮挡,是的,z-index的实际作用就是这样. 但是你真的了解z-index吗?你知道它有什么特性吗?这里先抛出几个名词:“层叠顺序(stacking order)”,“层叠上下文(stacking context)”,“层叠水平(stacking level)”. 先说一下z-index的基本用法: z-index可以设置成三个值: auto,默认值.当设置为aut

一个有关原型的问题牵扯出的问题

最近推荐一个朋友学习js,今天他问了我一个问题,问题如下: 1 function Box (){} 2 Box.prototype = { 3 name : 'Lee', 4 age : 28, 5 run : function (){ 6 return this.name+this.age+'运行中...'; 7 } 8 }; 9 var box = new Box(); 10 Box.prototype = { 11 age : 200 12 }; 13 alert(box.age); 这里

不起眼的 z-index 却能牵扯出这么大的学问

z-index在日常开发中算是一个比较常用的样式,一般理解就是设置标签在z轴先后顺序,z-index值大的显示在最前面,小的则会被遮挡,是的,z-index的实际作用就是这样. 但是你真的了解z-index吗?你知道它有什么特性吗?这里先抛出几个名词:“层叠顺序(stacking order)”,“层叠上下文(stacking context)”,“层叠水平(stacking level)”. 先说一下z-index的基本用法: z-index可以设置成三个值: auto,默认值.当设置为aut

&lt;原创&gt;一串简单的代码牵扯出的session,cookie,$_session,$_cookie之间关系问题

上述代码会产生怎么样的结果? a.php:  //报错 这个页面的值不难,将会报出一个notice( Undefined index: a)错误,因为cookie的返回值具有慢一拍特性,在页面中设置setcookie后,当用户访问时,需要把cookie键值对包含在http响应头返回给客户端,当你下次访问的时候,浏览器会着这份具有cookie值的请求头请求服务器,服务器也就知道当前的客户端存在这一份cookie值,然后再用到其他业务逻辑. b.php: //abc 这个页面的值是abc,其实第一次

语言独立性和与语言无关的组件

语言独立性和与语言无关的组件 .NET Framework 4.5 .NET Framework 是独立于语言的. 这意味着,作为开发人员,您可以使用面向 .NET Framework 的多种语言(例如,C#.C++/CLI.Eiffel.F#.IronPython.IronRuby.PowerBuilder.Visual Basic.Visual COBOL 以及 Windows PowerShell)之一进行开发. 您可以访问针对 .NET Framework 开发的类库的类型和成员,而不必

Android--aapt命令

1.aapt l[ist] [-v] [-a] file.{zip,jar,apk} 释义:列出压缩文件中的内容 aapt l xxx.apk:简单的罗列压缩文件中每一项的内容 aapt l -v xxx.apk:较详细输出内容 aapt l -a xxx.apk:详细输出压缩文件中所有目录的内容 2.aapt d[ump] [--values] [--include-meta-data] xxx.apk 释义:通过参数配置可以dump apk中各种详细信息 Example:aapt dump

【转】移动前端手机输入法自带emoji表情字符处理

http://blog.csdn.net/binjly/article/details/47321043 今天,测试给我提了一个BUG,说移动端输入emoji表情无法提交.很早以前就有思考过,手机输入法里自带的emoji表情,应该是某些特殊字符.既然是字符,那应该都能提交才对,可是为啥会被卡住呢?搜了一下,才发现,原来emoji用到的字符是4字节的utf-16(utf-16有2字节和4字节两种编码),而我们的数据库是采用的utf-8,并且最大只允许3字节的字符.这样冲突就产生了,表单因为这些em