字符集与编码01--charset vs encoding
声明:此文章转载自 http://my.oschina.net/goldenshaw/blog/304493
许多时候,字符集与编码这两个概念常被混为一谈,但两者是有差别的,作为深入理解的第一步,首先要明确:
字符集与字符集编码是两个不同层面的概念
charset是character set的简写,即字符集。
encoding是charset encoding的简写,即字符集编码,简称编码。
与接口及接口实现的对比
可以把这两者与接口及接口实现做个对比:
从这里可以很清楚地看到,
编码是依赖于字符集的,就像代码中的接口实现依赖于接口一样;
一个字符集可以有多个编码实现,就像一个接口可以有多个实现类一样。
具体例子及规范用法
可以简单看两个例子,一个自于html文件,用的是charset:
<meta http-equiv="content-type" content="text/html;charset=utf-8">
另一个来自于xml文件,用的是encoding:
<?xml version="1.0" encoding="UTF-8"?>
哪一种用法更规范呢?显然是后者,它更加准确地区分了字符集与编码的概念。
“charset=utf-8”容易让人误解为存在一种叫“UTF-8”的字符集,但实际上,无论是UTF-8还是UTF-16,UTF-32都是对同一种字符集的不同编码实现而已。
为什么要严格区分字符集与编码这两个概念?
字符集与编码一对一的情形
有很多的字符编码方案,一个字符集只有唯一一个编码实现,两者是一一对应的。比如GB2312,这种情况,无论你怎么去称呼它们,比如“GB2312编码”,“GB2312字符集”,说来说去其实都是一个东西,可能它本身就没有特意去做什么区分,所以无论怎么说都不会错。
为什么一对一是一种普遍的情况呢?
我们以GB2312为例,GB=Guo Biao=国标=国家标准,标准出来本来就为了统一,你一个标准弄出N个编码实现来,你让人家用哪个呢?
字符集与编码一对多的情形
事情到了Unicode这里,变得不一样了,唯一的Unicode字符集对应了三种编码:UTF-8,UTF-16,UTF-32。如果还是这么笼统地去称呼,就很容易搞混了。
为什么Unicode这么特殊?
人们弄出新的字符集标准,驱动力无外乎是旧的字符集里的字符不够用了。
Unicode的目标是统一所有的字符集,囊括所有的字符,所以字符集发展到它这里就到头了,再去整什么新的字符集就没必要也不应该了。
但如果觉得它现有的编码方案不太好呢?在不能弄出新的字符集情况下,只能在编码方面做文章了,于是就有了多个实现,这样一来传统的一一对应关系就打破了。
我们严格地区分字符集与编码两个概念,理由就在这里。
指定了编码,它所对应的字符集自然就指定了,编码才是我们最终要关心的。
Unicode早期与现在的对比
让我们来看一个图,它展现了Unicode早期与现在的一些差别:
注:由于历史方面的原因,你还会在不少地方看到把Unicode和UTF-8混在一块的情况,这种情况下的Unicode通常就是UTF-16或者是更早的UCS-2编码,在后面的篇章中我们会进一步分析。
下面是“记事本程序”保存时的一个截图,是Unicode的一个不规范使用,这里的Unicode就是指UTF-16:
我们现在说了不少Unicode,由于各种原因,必须承认,在不同的语境下,“Unicode”这个词有着不同的含义,它可能指:
Unicode标准
Unicode字符集
Unicode的抽象编码(编号),也即码点(code point)
Unicode的一个具体编码实现,通常即为变长的UTF-16(16或32位),又或者是更早期的定长16位的UCS-2
关于这些话题在后面的篇章里会做进一步探讨。
字符集与编码01--charset vs encoding的更多相关文章
- 字符集和字符编码(Charset & Encoding)
字符集和字符编码(Charset & Encoding)[转] 1.基础知识 计算机中储存的信息都是用二进制数表示的:而我们在屏幕上看到的英文.汉字等字符是二进制数转换之后的结果.通俗的说,按 ...
- 转:字符集和字符编码(Charset & Encoding)
转自:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创 ...
- 文件编码、charset、sublime编辑器支持GBK等问题
问题一:如何让sublime3支持GBK 首先打开package control ,然后键入install package进入,搜索ConvertToUTF8安装成功后 打开要查看的GBK文件,点击菜 ...
- 字符、字符集、编码,以及它们python中会遇到的一些问题(下)
在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主! 文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接! 侵删!!! 这一部分是下篇, ...
- Java 字符集,编码、解码
1. 计算机中文件.数据底层都是基于二进制的. 计算机底层并没有文本文件.图片文件之分,它只是记录着每个文件的二进制序列. 字符集:包含着字符和二进制序列之间的对应关系,一个字符对应一个二进制序列. ...
- 刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元
Unicode字符集的编码方式以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须 ...
- zzy:java采用的是16位的Unicode字符集作为编码方式------理解
java语言使用16位的Unicode字符集作为编码方式,是疯狂Java中的原话. 1,编码方式只是针对字符类型的(不包括字符串类,数值类型int等,这些只是在解释[执行]的时候放到Jvm的不同内存块 ...
- 字符集&各种编码&编码解码
要理解乱码问题,首先需要理解几个概念:字符集.编码.编码规则.乱码 1. 字符集: 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集(Charact ...
- 【转】字符集和字符编码(Charset & Encoding)
相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�????????"?还记得HTTP中的Accept-Charset.Accept ...
随机推荐
- 申请https证书需要注意的4大问题
HTTPS证书是什么 https证书是数字证书中的一种,由受信任的数字证书颁发机构CA如[沃通CA]在验证服务器身份后颁发,具有服务器身份验证和数据传输加密 功能,因其要配置在服务器上,所以也称SSL ...
- Log4j、slf4j
1.Log4j 1.1 Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出位置)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志 ...
- ecshop修改产品详情 折扣倒计时时间
文件:lefttime.js 位置:/js/lefttime.js 要求:去掉倒计时时间的 “天”数 原代码 ) { Temp = dateLeft + _day + hourZero + hour ...
- AJAX笔试面试题汇总
AJAX笔试面试题汇总 Javascript 1. 什么是ajax,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是“Asynchronous JavaScript a ...
- docker管理shipyard中文版v3.0.2更新
shipyard中文版v3.0.2更新 https://console.dockerclub.net/ https://dockerclub.net/docs/intro/getting_start ...
- Winform端上传图片到服务器
转载自 在winform实现文件上传到服务器 webform上传文件可能大家都写过很多,一个HtmlInputFile.PostedFile.SaveAs就搞定了,不过不知道大家有没有在winfor ...
- NGINX将PHP带参数的URL地址重定向二级或多级域名访问
今天项目中有一个手机站点需要用*.m.domain.com的三级域名访问. 如手机站点的访问网址为m.domain.com,手机下面的会员实际访问地址为index.php?username=$user ...
- Hibernate 查询MatchMode的四种模式
Hibernate 查询MatchMode的四种模式 MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最 ...
- html、css杂记
1:浮动 <div style="float: left"> 2:清除浮动,把父div撑起来 <div style="clear:both"& ...
- Nginx for Windows 使用笔记
一.常见启动错误 1. "No mapping for the Unicode character exists in the target multi-byte code page&quo ...