由iPhone emoji问题牵出UTF-16编码,UTF-8编码查询
前言
iOS平台,系统输入法emoji表达。表达式不能在很多其他平台上显示,尤其是在Android。Symbian系统。我决定到底要探索1;我指的是一些知识:
(注意:该博文已经如果读者已经了解utf-8的知识了)
1. 笔者提供的“将字符串转化成unicode和utf-8”的工具。
2. 维基百科utf-16 点击打开
3. 笔者博文,utf-8的介绍 点击打开
4. 笔者博文,完整unicode码表(网页打开较慢) 点击打开
问题描写叙述
开发和产品讨论字符占用的字节数。有人说2个,有人说4个。还有开发说iPhone的表情是iOS自定特定的。以下介绍一下emoji表情。
比方,在输入框输入一个emoji——微笑,然后通过UTF-8转化工具,看看它的编码是什么情况:
能够看到Unicode编码是 D83D-DE03。utf-8的编码是F09F-9883.这个不平常的,以下会具体介绍。
这里须要注意一下:通常utf-8是1到3个字节的,也就是说在Unicode编码空间的第0个平面上。
这里有必要说明一下utf-8的编码规则(很多其它点击这里)如图所看到的:
就上面这个表格。我们举个样例:拿“汉”字的汉来说。
它的unicode是0x6C49。utf8是0xE6B189,带入公式,发现是合乎规则的。
我们再看看“微笑”emoji符号的Unicode:D83D-DE03,已经超过了最大的0X10FFFF了,超过了最大的了怎么回事???以下我们依据utf-8的值:F09F-9883.来反推Unicode相应的数值吧,看看到底是为什么:
得出的结果是0x1-F603。我把这个值叫做utf-16.这个结果跟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。这就照顾上了。
详细的公式是:0x10000 + (前导-0xD800) * 0x400 + (后导-0xDC00) = utf-16编码。
就我们说的样例emoji而言。代入前导和后导。结果是:0x10000+(0xD83D - 0xD800)*0x400 + (0xDE03-0xDC00) = 0x1F603
作为程序猿的我们,笔者做一个形象的比喻:这对儿(前导代理,后尾代理)就像一个指针,指向了第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为。
计算机甚至不知道这是不是一个字符。或两个字符?
版权声明:本文博客原创文章,博客,未经同意,不得转载。
由iPhone emoji问题牵出UTF-16编码,UTF-8编码查询的更多相关文章
- 记录一下通过分析Tomcat内部jar包找出request.getReader()所用的字符编码在哪里设置和起效的完整分析流程
前言: 之前写Java服务端处理POST请求时遇到了请求体转换成字符流所用编码来源的疑惑,在doPost方法里通过request.getReader()获取的BufferedReader对象内部的 R ...
- mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】
utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程 ...
- 一口气说出 Redis 16 个常见使用场景!
1.缓存 String类型 例如:热点数据缓存(例如报表.明星出轨),对象缓存.全页缓存.可以提升热点数据的访问数据. 文章首发于:http://ht5n8.cn/LEc6v 2.数据共享分布式 St ...
- 带emoji表情弹出层的评论框,semantic+emoji picker,java.sql.SQLException: Incorrect string value: '\xF0\x9F..'
在自己做一个项目玩时,在做评论的时候. 选中了semantic.js原型,这个在国内用的不是很多,但是在github上star数量很高,想当初我想找一个js框架是就在上面找的. semantic中文网 ...
- P2P风险淮安样本:5000万连锁漩涡牵出银行内案
春节后第一个工作周,来自南京的投资人李宏(化名)频繁游走于两个维权群,因为在江苏淮安的网贷平台投资经历,他结识了136名P2P投资人. 在他们的QQ群里,每个投资人的备注均为网名+投资额,如他自己的“ ...
- 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- 去掉iphone上拨号弹出框
1.常规的方法可以直接去除默认事件event.preventDefault() 2.使用vue的话可以: <div @click.stop.prevent=</div> //或者 & ...
- [No000033]码农网-如何锻炼出最牛程序员的编码套路
最近,我大量阅读了Steve Yegge的文章.其中有一篇叫"Practicing Programming"(练习编程),写成于2005年,读后令我惊讶不已: 与你所相信的恰恰相反 ...
- 在PHP中对查询出得数据库数据进行json编码
select.php <?php $con = mysql_connect("localhost","Thh","920920thh" ...
随机推荐
- jquery下php与ajax的互传数据(json格式)自我总结
研究了一整天的json数据与ajax的数据传输,现在进行一个小的自我总结,仅供参考 1.关于ajax的认识 $.ajax(),是jquery下包装好的一个函数:参考地址:http://www.w3sc ...
- Mac 登录界面多了一个其它账户删除
原因分析: 在安装一些软件时会自己主动启用root账户,可是在安装完毕后没有关闭root账户,这样就造成系统以为用户要使用root账户,所以在登录界面出现了一个"其它"账户 解决方 ...
- Linux内核的同步机制---自旋锁
自旋锁的思考:http://bbs.chinaunix.net/thread-2333160-1-1.html 近期在看宋宝华的<设备驱动开发具体解释>第二版.看到自旋锁的部分,有些疑惑. ...
- dpdk组态 千兆网卡 驱动 失败 原因分析及 解决方案
dpdk版本号是1.7.1稳定版,server它是ubuntu12.04LTS x86 64bit 绑定默认驱动程序千兆网卡ixgbe失败 # ./dpdk_nic_bind.py -b ixgbe ...
- easyui出口excel无法下载框弹出的办法来解决
使用前ajax发,码如下面(ActionUrl一般处理程序ashx路径): $.ajax({ url: ActionUrl + '?action=export&ID=' + $('#fm_ID ...
- 基础知识(1)- Java程序设计概述
1.1 Java程序设计平台 1.2 Java“白皮书”的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 1.2.4 健壮性 1.2.5 安全性 1.2.6 体系 ...
- Python3.4 邮件(包含附件与中国)
import smtplib import os from email.mime.text import MIMEText from email.mime.multipart import MIMEM ...
- 【原创】编写多线程Python爬虫来过滤八戒网上的发布任务
目标: 以特定语言技术为关键字,爬取八戒网中网站设计开发栏目下发布的任务相关信息 需求: 用户通过设置自己感兴趣的关键字或正则表达式,来过滤信息. 我自己选择的是通过特定语言技术作为关键字,php.j ...
- 最近做RTSP流媒体的实时广播节目
//h264视频流打包代码 // NALDecoder.cpp : Defines the entry point for the console application. #include < ...
- effective c++ 条款7 declare virtual destructor for polymophyc base class
这似乎很明显. 如果base class的destructor不是virtual,当其derived class作为基类使用,析构的时候derived class的数据成员将不会被销毁. 举个例子 我 ...