当前访客身份:游客 [ 登录  | 注册加入尚学堂]
启用新域名sxt.cn
新闻资讯

深入图解字符集与字符集编码(一)——charset vs encoding

我来了! 发表于 2年前  | 评论(0 )| 阅读次数(596 )|   1 人收藏此文章,   我要收藏

字符集字符集编码是两个不同层面的概念

  • charset是character set的简写,即字符集

  • encoding是charset encoding的简写,即字符集编码,简称编码

可以把这两者与接口接口实现做个对比:

从这里可以很清楚地看到,

  1. 编码是依赖于字符集的,就像代码中的接口实现依赖于接口一样;

  2. 一个字符集可以有多个编码实现,就像一个接口可以有多个实现类一样。

可以简单看两个例子,分别来自于html文件与xml文件中,一个用了charset,一个则是encoding:

?
1
<meta http-equiv="content-type" content="text/html;charset=utf-8">
?
1
<?xml version="1.0" encoding="UTF-8"?>

哪一种用法更规范呢?显然是后者,它更加准确地区分了字符集与编码的概念。


为什么要严格区分字符集编码这两个概念?


字符集编码一对一的情形

有很多的字符编码方案,一个字符集只有唯一一个编码实现,两者是一一对应的。比如GB2312,这种情况,无论你怎么去称呼它们,比如“GB2312编码”,“GB2312字符集”,说来说去其实都是一个东西,可能它本身就没有特意去做什么区分,所以无论怎么说都不会错。

为什么一对一是一种普遍的情况呢?


我们以GB2312为例,GB=Guo Biao=国标=国家标准,标准出来本来就为了统一,你一个标准弄出N个编码实现来,你让人家用哪个呢?


字符集编码一对多的情形

事情到了unicode这里,变得不一样了,唯一的unicode字符集对应了三种编码:UTF-8,UTF-16,UTF-32。如果还是这么笼统地去称呼,就很容易搞混了。

为什么unicode这么特殊?


人们弄出新的字符集标准,驱动力无外乎是旧的字符集里的字符不够用了。

unicode的目标是统一所有的字符集,囊括所有的字符,所以字符集发展到它这里就到头了,再去整什么新的字符集就没必要也不应该了。

但如果觉得它现有的编码方案不太好呢?在不能弄出新的字符集情况下,只能在编码方面做文章了,于是就有了多个实现,这样一来传统的一一对应关系就打破了。

我们严格地区分字符集与编码两个概念,理由就在这里。

指定了编码,它所对应的字符集自然就指定了,编码才是我们最终要关心的。

让我们来看一个图,它展现了unicode早期与现在的一些差别:

注:由于历史方面的原因,你还会在不少地方看到把Unicode和UTF-8混在一块的情况,这种情况下的Unicode通常就是UTF-16或者是更早的UCS-2编码,在后面的篇章中我们会进一步分析。

我们现在说了不少unicode,但我们还没有准确地定义这个词,我们可能有些疑问,如:

unicode是不是就是指unicode字符集呢?

unicode编码是不是就是指UTF-8,UTF-16,UTF-32这些东西呢?

这些问题没办法简单用是和否回答,在第二篇里会做进一步探讨。

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183