Unicode 和 UTF-8 是什么关系?
2015-10-14 10:08 评论: 9 收藏: 4
转载自: http://huoding.com/2015/10/13/472作者: 火丁笔记
本文地址:https://linux.cn/article-6400-1.html
绝大多数程序员都听说过 Unicode 和 UTF-8,但是清楚它们之间关系的人就不多了,关于这个问题,与其苍白的陈述它们的概念,不如举例子说明来得自然。

我前些天碰到一个需求:随机生成几个汉字。原本我便对编码之类的问题发怵,所以完全搞不清楚状况,无奈之下我便上网搜索了一个 PHP 版本的实现:
<?php$zh = '';for($i = 0; $i < 3; $i++) {$zh .= '&#'. rand(19968, 40869) . ';';}echo mb_convert_encoding($zh, 'UTF-8', 'HTML-ENTITIES');?>
不过代码里的「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
因为我们编码是 UTF-8,所以就先看看「博」字的 UTF-8 编码是什么:
<?php$string = "博";for ($i = 0; $i < strlen($string); $i++) {echo dechex(ord($string[$i]));}?>
代码看上去有点冗长,实际上利用 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 是编码。
Unicode 和 UTF-8 是什么关系?的更多相关文章
- Unicode和UTF的关系
目录结构: contents structure [+] 什么是USC UCS的编码方式 Unicode的来源 为什么需要Unicode Unicode的方式 Unicode和UTF UTF和Unic ...
- Unicode、UTF-8 和 ISO8859-1
Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...
- ascii、unicode、utf、gb等编码详解
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这 ...
- Unicode 与 UTF 字符标准
Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示. Unicode用两个字节表示一个字符.前127个字符与A ...
- Unicode、UTF-8 和 ISO8859-1到底有什么区别
说明:本文转载于新浪博客,旨在方便知识总结.原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html 本文主要包括以下几个方面:编码基本知识, ...
- Delphi7中Unicode,ANSI,UTF编码问题
注解: ANSI 'American Standard Code for Information Interchange' 美国信息互换标准代码 ANSI的'Ascii'编码 Unicode ...
- ASCII、UNICODE、UTF
在计算机中,一个字节对应8位,每位可以用0或1表示,因此一个字节可以表示256种情况. ascii 美国人用了一个字节中的后7位来表达他们常用的字符,最高位一直是0,这便是ascii码. 因此asci ...
- Unicode 与 utf8 utf16 utf32的关系
Unicode是计算机领域的一项行业标准,它对世界上绝大部分的文字的进行整理和统一编码,Unicode的编码空间可以划分为17个平面(plane),每个平面包含2的16次方(65536)个码位.17个 ...
- 简述 ascii、unicode、utf-8、gbk 的关系 (全网最全!!!)
ascii 是最早美国用的标准信息交换码,把所有的字母的大小写,各种符号用 二进制来表示,共有256中,加入些拉丁文等字符,1bytes代表一个字符, Unicode是为了统一世界各国语言的不用,统一 ...
- 字符编码ascii、unicode、utf-‐8、gbk 的关系
ASIIC码: 计算机是美国人发明和最早使用的,他们为了解决计算机处理字符串的问题,就将数字字母和一些常用的符号做成了一套编码,这个编码就是ASIIC码.ASIIC码包括数字大小写字母和常用符号,一共 ...
随机推荐
- 为每个页面加上Session判断
首先新建一个类,继承自System.Web.UI.Page,然后重写OnInit,如下: using System; using System.Data; using System.Configura ...
- Entity Framework "There is already an open DataReader associated with this 的解决办法
解决办法: 1,修改连接串,加上MultipleActiveResultSets=true 2, 一次性先把数据读出来 var contacts = from c in db.Contact sele ...
- 利用inotifywait监控主机文件和目录
利用inotifywait监控主机文件和目录 inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ...
- plist 与 JOSN的解析
- 关于linux PPA源问题
添加PPA: 1.首先进入ubuntu系统,system—>administration—>update manager—>setting,在软件源界面,点击other softwa ...
- linux学习笔记34--命令rcp和scp
rcp代表“remote file copy”(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝:第二种格式用于把文件或目录拷贝到另一个目录中. 1 ...
- 跟着百度学PHP[16]-验证码的学习
一个验证码需要有以下步骤: 验证底图 验证码内容 生成验证码 对比校验 验证码需要依靠PHP的GD扩展库.一些集成环境是默认安装了GD拓展库. <?php //创建一个100*30px图片,默认 ...
- hadoop 调试mapperduce
问题描述 运行hadoop的MapReduce示例,在running job卡住 在页面中显示一直处于 ACCEPTED Applications 状态 修改日志级别export HADOOP_ROO ...
- How to add total page to Odoo Report(7.0 version)
add this codes to your rml file: <drawRightString x="19.5cm" y="0.3cm">Pag ...
- The Definitive Guide To Django 2 学习笔记(四) 动态URLs
前面的例子中,虽然时间是动态可变的,但它的URL却是静态的(/time/).很多时候,URL也是需要动态改变,然后展示出不通的内容来.现在我们就来创建一个可以动态改变URL的例子. 如果URLconf ...