`

字符集系列之----深入字符集和编码

阅读更多

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

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

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

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

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

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


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

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

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


二、有哪些字符集?


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

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

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

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

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

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

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

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


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 SetUCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。

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

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

    * UCS-2:
unicode2byte编码基本一样。

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


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

它是http://www.unicode.org制定的编码机制, 要将全世界常用文字都函括进去。

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

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

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

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

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


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

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

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

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

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



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

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

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

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


ANSI
Unicode big endia:
我们在Windows系统中保存文本文件时通常可以选择编码为ANSIUnicodeUnicode big endianUTF-8,这里的ANSIUnicode 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。而FFFEUCS中是不存在的字符,所以不应该出现在实际传输中。

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才是编码界最通用的语言。

分享到:
评论

相关推荐

    GB 18030-2005 信息技术 中文编码字符集

    《GB 18030-2005 信息技术 中文编码字符集》是中华人民共和国国家标准,由国家质量监督检验检疫总局发布,于2005年4月6日实施。这一标准主要针对中文字符的编码问题,旨在提供一个全面、统一、高效的中文字符编码...

    字符集和字符编码详解

    字符集和字符编码是计算机处理文字的基础,它们决定了如何在二进制的世界中表示和传输人类语言。本文将深入探讨这两个概念,以及相关的...因此,深入学习并掌握字符集和字符编码的知识,对于IT专业人士来说至关重要。

    常用字符集及字符编码简介

    字符集与字符编码是计算机处理文字的基础,它们决定了如何用二进制表示各种语言的字符。在信息技术领域,理解和掌握字符集与字符编码至关...通过阅读这些文件,你可以进一步深入理解字符集和字符编码的概念及其应用。

    java字符集编码问题

    本文旨在深入探讨与Java相关的字符集编码知识,包括但不限于编码的基本概念、几种常见的字符集编码类型及其特点,以及Java如何处理这些字符集编码问题。 #### 二、编码基本知识 1. **ISO 8859-1** ISO 8859-1是...

    Java字符集和编码

    因此,深入理解Java中的字符集和编码对于解决这些问题至关重要。 #### 二、基础知识 ##### 1. ASCII编码 ASCII编码(American Standard Code for Information Interchange,美国标准信息交换码)是由美国国家标准...

    深入理解字符编码(字符集 字符编码 字符显示 乱码问题)

    文档中主要介绍了各类字符集以及相关的字符编码,字符的显示原理,从输入到显现的整个过程,程序中出现的乱码问题以及解决方案

    字符集编码开发总结-BMP查看器

    本篇文章将深入探讨字符集编码的概念,特别是针对“BMP查看器”这一工具的开发总结。BMP(Bitmap)是一种常见的位图图像格式,通常用于存储无压缩的图像数据。开发一个能够正确解析并显示BMP图像的查看器,对于理解...

    JAVA及相关字符集编码问题

    JAVA及相关字符集编码问题 在深入探讨JAVA与字符集编码问题之前,我们首先需要理解不同字符集编码的基本概念...通过上述对JAVA及相关字符集编码问题的深入探讨,希望能帮助开发者们更好地理解和应对这一领域内的挑战。

    qt实现转换文件字符集编码

    本篇文章将深入探讨如何使用Qt库在C++中实现文件字符集编码的转换。 首先,让我们理解字符集编码的基本概念。常见的字符集编码有ASCII、GB2312、GBK、UTF-8、UTF-16等。ASCII是最基础的7位编码,只能表示128个基本...

    oracle 中文字符集问题

    本文将深入探讨Oracle中的中文字符集问题,包括其基本概念、常见字符集类型以及如何在不同场景下正确配置和使用字符集。 #### 一、Oracle字符集概述 在Oracle环境中,字符集用于定义如何表示和存储字符数据。一个...

    gb18030所有字符集与码表.rar

    《GB18030字符集详解及其码表解析》 GB18030,全称为《信息技术...通过深入研究"gb18030所有字符集与码表.xls",开发者可以更好地掌握GB18030的编码规则,从而在嵌入式系统和其他应用场景中实现高效、准确的文本处理。

    JIS标准编码字符汇总文件包

    SHIFTJIS.txt 文件则列出了按照SHIFTJIS编码的字符集。 这些文件为开发者、程序员、语言学者提供了全面的JIS编码字符参考,无论是进行文本处理、编程开发还是学术研究,都是不可或缺的工具。通过深入理解并掌握这些...

    Oracle 字符集详解

    常见的Oracle字符集有AL32UTF8(支持Unicode的UTF-8编码)、WE8ISO8859P1(西欧字符集)、ZHS16GBK(简体中文GB18030编码)等。 六、多语言环境下的字符集配置 在处理多语言数据时,Oracle提供了NLSSORT参数来调整...

    Java中的字符集编码入门(二)编码字符集与字符集编码的区别[参考].pdf

    在Java编程语言中,理解和掌握字符集编码是至关重要的,特别是在处理各种文本数据时。本文主要探讨了编码字符集和字符集编码的区别,这对于软件开发人员来说是基础且必要的知识。 首先,我们要区分两个概念:编码...

    Java字符集编码简记

    本文将围绕“Java字符集编码简记”这一主题,深入探讨相关知识点,并结合标签“源码”和“工具”,探讨在实际开发中如何运用和处理字符编码问题。 首先,我们需要理解字符集的概念。字符集是一系列符号的集合,例如...

    Unicode字符集 8.0 2015-06-17最新标准

    综上所述,Unicode 8.0不仅在字符数量上有所增加,更重要的是其在多语言支持、表情符号扩展等方面进行了显著改进,极大地丰富了Unicode字符集的功能性和实用性。通过深入学习Unicode 8.0的相关文档和技术报告,...

    标准波斯语字符集-Learning Farsi Font

    根据提供的文件信息,我们可以深入探讨波斯语字符集的相关知识点,包括波斯语字符的特点、如何在软件...通过深入了解波斯语字符集的特点和规则,开发者可以更好地满足目标用户的需求,提供更加友好和准确的应用体验。

    字符集编码和理解材料

    字符集编码是计算机科学中的一个基础概念,它关乎着如何在数字世界中表示和处理文本。这个主题由多个部分组成,包括字符集、编码方式以及它们的实际应用。在这个压缩包中,我们有三份文件,分别涉及了不同层面的字符...

    各种字符集编码表,包括iso-8859-1,gbk,gb18030, unicode

    本文将深入探讨四种常见的字符集编码:ISO-8859-1、GBK、GB18030以及Unicode,并结合Java国际化的字符集转换进行详细说明。 1. ISO-8859-1:这是一种西欧字符编码,包含拉丁字母、数字、标点符号和一些特殊字符。它...

Global site tag (gtag.js) - Google Analytics