网页的字符集和编码

  一、什么是字符集?什么是编码?

  字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。

  一组抽象字符的集合就是字符集(Charset)。

  字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。

  一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。

  字符集的子集也是字符集。

  计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。

  制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。

  每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多是这个含义。

  二、有哪些字符集?

  ASCII:

  American Standard Code for Information Interchange,美国信息交换标准码。

  目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。

  它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。

  ASCII字符集由控制字符和图形字符组成。

  在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。

  所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。

  奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1。

  偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

  ISO 8859-1:

  ISO 8859,全称ISO/IEC 8859,是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准,现时定义了15个字符集。

  ASCII收录了空格及94个“可印刷字符”,足以给英语使用。

  但是,其他使用拉丁字母的语言(主要是欧洲国家的语言),都有一定数量的变音字母,故可以使用ASCII及控制字符以外的区域来储存及表示。

  除了使用拉丁字母的语言外,使用西里尔字母的东欧语言、希腊语、泰语、现代阿拉伯语、希伯来语等,都可以使用这个形式来储存及表示。

  * ISO 8859-1 (Latin-1) - 西欧语言

  * ISO 8859-2 (Latin-2) - 中欧语言

  * ISO 8859-3 (Latin-3) - 南欧语言。世界语也可用此字符集显示。

  * ISO 8859-4 (Latin-4) - 北欧语言

  * ISO 8859-5 (Cyrillic) - 斯拉夫语言

  * ISO 8859-6 (Arabic) - 阿拉伯语

  * ISO 8859-7 (Greek) - 希腊语

  * ISO 8859-8 (Hebrew) - 希伯来语(视觉顺序)

  * ISO 8859-8-I - 希伯来语(逻辑顺序)

  * ISO 8859-9 (Latin-5 或 Turkish) - 它把Latin-1的冰岛语字母换走,加入土耳其语字母。

  * ISO 8859-10 (Latin-6 或 Nordic) - 北日耳曼语支,用来代替Latin-4。

  * ISO 8859-11 (Thai) - 泰语,从泰国的 TIS620 标准字集演化而来。

  * ISO 8859-13 (Latin-7 或 Baltic Rim) - 波罗的语族

  * ISO 8859-14 (Latin-8 或 Celtic) - 凯尔特语族

  * ISO 8859-15 (Latin-9) - 西欧语言,加入Latin-1欠缺的法语及芬兰语重音字母,以及欧元符号。

  * ISO 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。

  很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。

  但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。

  而且在很多协议上,默认使用该编码。

  UCS:

  通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。

  UCS包含了已知语言的所有字符。

  除了拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、格鲁吉亚语,还包括中文、日文、韩文这样的象形文字,UCS还包括大量的图形、印刷、数学、科学符号。

  * UCS-2: 与unicode的2byte编码基本一样。

  * UCS-4: 4byte编码, 目前是在UCS-2前加上2个全零的byte。

  Unicode:

  Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。

  它是制定的编码机制, 要将全世界常用文字都函括进去。

  它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

  1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。

  但自从unicode2.0开始,unicode采用了与ISO 10646-1相同的字库和字码,ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值,使得两者保持一致。

  Unicode的编码方式与ISO 10646的通用字符集(Universal Character Set,UCS)概念相对应,目前的用于实用的Unicode版本对应于UCS-2,使用16位的编码空间。

  也就是每个字符占用2个字节,基本满足各种语言的使用。实际上目前版本的Unicode尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。

  UTF:

  Unicode 的实现方式不同于编码方式。

  一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。

  Unicode的实现方式称为Unicode转换格式(Unicode Translation Format,简称为 UTF)。

  * UTF-8: 8bit变长编码,对于大多数常用字符集(ASCII中0~127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节。

  * UTF-16: 16bit编码,是变长码,大致相当于20位编码,值在0到0x10FFFF之间,基本上就是unicode编码的实现,与CPU字序有关。

  汉字编码:

  * GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。

  * BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。

  * GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。

  * GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。

  ANSI和Unicode big endia:

  我们在Windows系统中保存文本文件时通常可以选择编码为ANSI、Unicode、Unicode big endian和UTF-8,这里的ANSI和Unicode big endia是什么编码呢?

  ANSI:

  使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。

  在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。

  Unicode big endia:

  UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。

  Unicode规范中推荐的标记字节顺序的方法是BOM(即Byte Order Mark)。

  在UCS编码中有一个叫做ZERO WIDTH NO-BREAK SPACE的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

  UCS规范建议我们在传输字节流前,先传输字符ZERO WIDTH NO-BREAK SPACE。

  这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。

  因此字符ZERO WIDTH NO-BREAK SPACE又被称作BOM。

  Windows就是使用BOM来标记文本文件的编码方式的。

  三、编程语言与编码

  C、C++、Python2内部字符串都是使用当前系统默认编码

  Python3、Java内部字符串用Unicode保存

  Ruby有一个内部变量$KCODE用来表示可识别的多字节字符串的编码,变量值为EUC SJIS UTF8 NONE之一。

  $KCODE的值为EUC时,将假定字符串或正则表达式的编码为EUC-JP。

  同样地,若为SJIS时则认定为Shift JIS。若为UTF8时则认定为UTF-8。

  若为NONE时,将不会识别多字节字符串。

  在向该变量赋值时,只有第1个字节起作用,且不区分大小写字母。

  e E 代表 EUC,s S 代表 SJIS,u U 代表 UTF8,而n N 则代表 NONE。

  默认值为NONE。

  即默认情况下Ruby把字符串当成单字节序列来处理。

  四、为什么会乱码?

  乱码是个老问题,从上面我们知道,字符在保存时的编码格式如果和要显示的编码格式不一样的话,就会出现乱码问题。

  我们的Web系统,从底层数据库编码、Web应用程序编码到HTML页面编码,如果有一项不一致的话,就会出现乱码。

  所以,解决乱码问题说难也难说简单也简单,关键是让交互系统之间编码一致。

  五、有没有万金油?

  在如此多种编码和字符集弄的我们眼花缭乱的情况下,我们只需选择一种兼容性最好的编码方式和字符集,让它成为我们程序子系统之间

  交互的编码契约,那么从此恼人的乱码问题即将远离我们而去 -- 这种兼容性最好的编码就是UTF-8!

  毕竟GBK/GB2312是国内的标准,当我们大量使用国外的开源软件时,UTF-8才是编码界最通用的语言。

  这篇文章出自:济南网站建设 http://www.jinanwangzhanjianshe.com

时间: 2024-10-09 18:20:05

网页的字符集和编码的相关文章

你不知道的 字符集和编码(编码字符集与字符集编码)

原文:你不知道的 字符集和编码(编码字符集与字符集编码) 我的上篇文章,有朋友提出字符集和编码的区别,我在此立文和大家讨论下 常说的字符集和编码区别,其实就是编码字符集和字符集编码的区别,其实,单单如果只是说字符集,没有任何编码的概念的话,那么字符集其实仅仅是一个简单的字符的集合,或者说是一个抽象的字符的集合,包括文字,符号等等,不参与任何存储形式,只是存在这么各种各样标准的字符的集合 如果仅仅是抽象的字符集,我们是无需拿出讨论的,因为没有任何异议,通俗易懂,而常说的字符集指的编码字符集,比如常

字符集和编码方式的问题

问题描述 请教各位大侠,字符集和编码方式有什么区别和关联呢?昨晚看到这样的几句话"UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16,UTF-32和UTF-7编码",一直以为UNICODE,UTF-8都是字符集,看了这以后迷惑了,请教各位解惑?另外还有一个问题,iso8859-1只有255字符,为什么还能显示中文呢?编码是不是就是一种寻址方式?

十分钟搞清字符集和字符编码

十分钟搞清字符集和字符编码 本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧 背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题.当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难. 本文就将会从原理方面对字符集和编码做个简单的科普介绍,同时也会介绍一些通用的乱码故障定位的方法以方便读者以后能够更从容的定位相关问题. 在正式介绍之前,先做个小申明:如果你希望非常精确的理解各个名词的解释,那么可以查阅wikipedia.本文是博主通过自己理解消化后并转

MySQL字符集和校对规则(Collation)

MySQL字符集和校对规则(Collation) 阅读目录:MySQL的字符集和校对规则 MySQL的字符集 MySQL与字符集 正确使用字符集 MySQL客户端与字符集 字符集编码转换原理 字符集常见处理操作 字符集的正确实践 MySQL的校对规则 一.字符集(Character set) 是多个字符(英文字符,汉字字符,或者其他国家语言字符)的集合,字符集种类较多,每个字符集包含的字符个数不同. 特点: ①字符编码方式是用一个或多个字节表示字符集中的一个字符 ②每种字符集都有自己特有的编码方

字符集和字符编码(Charset & Encoding)

--每个软件开发人员应该无条件掌握的知识! --Unicode伟大的创想! 相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来我们要探讨的. 目录: 1.基础知识 2.常用字符集和字符编码 2.1. ASCII字符

字符集和字符编码(Charset & Encoding)_其它综合

相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�????????"?还记得HTTP中的Accept-Charset.Accept-Encoding.Accept-Language.Content-Encoding.Content-Language等消息头字段?这些就是接下来我们要探讨的. 目录: 1.基础知识 2.常用字符集和字符编码2.1. ASCII字符集&编码2.2. GBXXXX字符集&编码2.3. BIG5字

MySQL的字符集和排序方式

字符串类型 MySQL的字符串分为两大类: 1)二进制字符串:即一串字节序列,对字节的解释不涉及字符集,因此它没有字符集和排序方式的概念 2)非二进制字符串:由字符构成的序列,字符集用来解释字符串的内容,排序方式决定字符的大小 字符集和排序方式 字符集和排序方式的关系是这样的:一个字符集可以有一个或多个排序方式,有一个默认的排序方式,我们可以通过 以下例子说明: mysql> show character set like '%gbk%'; +---------+----------------

MySQL字符集和copy_and_convert

关于copy_and_convert     在对MySQL做业务压力测试的时候,我们在perf结果中发现 copy_and_convert 是一个耗费cpu的操作.这个函数的意思,就是在字符集之间做内容转换.     如果源和目标的字符集相同,就可以直接用memcpy,这显然比做字符集转换(按字节或字长拷贝更快,和节省cpu)  当整个系统是CPU瓶颈时,我们希望能够减少这种cpu消耗.    一次查询涉及的拷贝     如果我们执行一个简单的select语句,会涉及到两部分的内容:metad

《MySQL DBA修炼之道》——3.7 字符集和国际化支持

3.7 字符集和国际化支持 3.7.1 什么是字符集 字符集(character set)是一套符号和编码.校对规则(collation)是在字符集内用于比较字符的一套规则,即字符集的排序规则. 假设我们有一个字母表使用了4个字母:'A'.'B'.'a'.'b'.现在为每个字母赋予一个数值:'A'=0,'B'= 1,'a'= 2,'b'= 3,字母'A'是一个符号,数字0是'A'的编码,那么这4个字母和它们的编码组合在一起就是一个字符集.我们可以认为字符集是字符的二进制的编码方式,即二进制编码到