Unicode 和 UTF-8 是什么关系?

简介:

绝大多数程序员都听说过 Unicode 和 UTF-8,但是清楚它们之间关系的人就不多了,关于这个问题,与其苍白的陈述它们的概念,不如举例子说明来得自然。

我前些天碰到一个需求:随机生成几个汉字。原本我便对编码之类的问题发怵,所以完全搞不清楚状况,无奈之下我便上网搜索了一个 PHP 版本的实现:


 
 
  1. <?php
  2. $zh = '';
  3. for($i = 0; $i < 3; $i++) {
  4. $zh .= '&#'. rand(19968, 40869) . ';';
  5. }
  6. echo mb_convert_encoding($zh, 'UTF-8', 'HTML-ENTITIES');
  7. ?>

不过代码里的「19968」和「40869」是什么玩意?这又牵扯到 Unicode code points,为了更好的说明问题,我们需要把如上十进制转换成十六进制:

shell> php -r 'echo dechex(19968);'
4e00

shell> php -r 'echo dechex(40908);'
9fcc

在 Unicode 官方网站,我们能查到 Unihan Grid Index,其中 CJK Unified Ideographs 部分包含了大部分的汉字,其 code points 恰恰是从 U+4E00 到 U+9FCC!

单单上面一个例子还不足以说明问题,下面我们挑选一个「」字深入说明一下:

Unicode

Unicode

因为我们编码是 UTF-8,所以就先看看「博」字的 UTF-8 编码是什么:


 
 
  1. <?php
  2. $string = "博";
  3. for ($i = 0; $i < strlen($string); $i++) {
  4. echo dechex(ord($string[$i]));
  5. }
  6. ?>

代码看上去有点冗长,实际上利用 pack/unpack 函数可以很简单的实现类似的逻辑:

shell> php -r 'var_dump(unpack("H6", "博"));'
array(1) {
  ["codes"]=>
  string(6) "e58d9a"
}

于是乎「博」字的 UTF-8 编码是「e58d9a」,再看怎么得到 unicode code point:

shell> php -r 'echo base_convert("e58d9a", 16, 2);'
11100101 10001101 10011010

如上拿到了「博」字的二进制表示,实际上其 unicode code point 就隐藏在这里。通常汉字用 UTF-8 表示时是三个字节,格式为「1110XXXX 10XXXXXX 10XXXXXX」,除掉标志位,把剩余对应位置上的数据抽取出来连接在一起,就得到了 Unicode code point,也就是「0101 001101 011010」,剩下的就简单了,把它从二进制转换成十六进制即可:

shell> php -r 'echo base_convert("0101001101011010", 2, 16);'
535a

需要说明的是,如果你仅仅看「博」字,会发现其 Unicode code point 和 UTF-16 是一样的,很容易据此认为它们是等同的概念,实际上这个结论仅仅在双字节(UCS-2)时才是成立的,一旦大于两个字节,就不成立了,有兴趣的可以参考相应的例子

到底 Unicode 和 UTF-8 是什么关系?一句话:Unicode 是字符集;UTF-8 是编码

本文来自云栖社区合作伙伴“Linux中国”,原文发布日期:2015-10-14

目录
相关文章
|
10月前
|
供应链 算法 调度
【双层模型】考虑供需双侧的综合能源双层优化模型
该程序构建了一个综合能源系统的优化调度双层模型,采用差分进化算法和规划算法分别求解上下层问题。模型涵盖了燃气轮机、锅炉、风电、光伏及储能设备的协同运行,并考虑了供应商与用户的利益平衡。通过满足设备出力、储能、负荷平衡等约束条件,实现了系统经济性和性能的优化。程序基于Matlab+Cplex编写,注释详尽且附带文档说明,便于学习研究。
|
11月前
|
存储 缓存 固态存储
阿里云服务器租用价格参考,云服务器收费标准与活动价格表参考
本文为大家展示阿里云服务器最新的收费标准与活动价格情况,以供了解和参考。
阿里云服务器租用价格参考,云服务器收费标准与活动价格表参考
|
网络协议
Internet的形成与发展
Internet的形成与发展。
920 1
|
运维 网络虚拟化
阿里云RPA中,控件超时
阿里云RPA中,控件超时
758 1
|
机器学习/深度学习 人工智能 算法
商品3D建模的视觉定位和前景分割方法
2021年10月,大淘宝技术发布了基于神经渲染的3D建模产品object drawer ,用户只需要环拍一圈商品的视频,就可以生成3D模型。 在物体重建算法流程中,需要先计算出每一帧图像的相机位姿(平移和旋转)。之后需要对图像中前/背景进行像素级的分割,重建时只需考虑前景而忽略背景像素。准确的相机位姿和前景分割结果是保证高质量重建的前提。
891 0
商品3D建模的视觉定位和前景分割方法
|
存储 缓存 NoSQL
Redis持久化:RDB和AOF配置和对比
Redis持久化:RDB和AOF配置和对比
Redis持久化:RDB和AOF配置和对比
|
安全
在阿里云后置台充值后如何提现—详细教程
您可前往新用户中心,在新用户中心页面,可以看到您的余额和提现入口,点击提现按钮,进入到提现页面进行提现操作。阿里云余额提现,提现到哪里?操作流程
2340 2
|
物联网 AliOS-Things 开发工具
HaaS100 快速开始
介绍HaaS100主板的代码下载,编译,烧录
15113 15
HaaS100 快速开始
|
弹性计算 移动开发 小程序
云服务器体验
有了一台云服务器后,我不禁想到如何才能够利用好这台服务器,给我的生活带来更多便捷和乐趣。带着这个目标,我开始广泛地了解服务器的原理和应用。在计算机网络世界中,相比个人电脑,服务器发挥了更加关键的作用,它响应用户们的请求并进行处理,为丰富多彩的互联网默默付出,贡献着自己的资源。 因为是第一次使用阿里云服务器ECS,对使用过程不太熟悉,遇到了很多的困难,比如对Linux语句的不熟悉。在完成服务器的选择后,第一步就是配置自己项目的运行环境。 经过对阿里云ECS服务器的使用与熟悉,逐渐对服务器有了个初步的认识。在使用过程中,让我难忘的就是创建一个实例,搭建服务器的过程,虽然这个过程挺艰难的,但是按照网
229 1