黑马程序员训练营:字符编码

来源:互联网 发布:2016年汽车保险数据 编辑:程序博客网 时间:2024/05/16 14:02

一、 什么是字符编码?

为了满足人与计算机的交互需要,首先要解决的问题就是语言的翻译问题。作为计算机,其语言的符号集合是确定的:{0,1} 。然而人的语言却是多种多样的,不同国家或地区的语言符号集合存在很大的差异。也正因此,不同国家或地区都建立了各自的计算机字符编码集,以满足和规范本地人与计算机的交互需求。

从根本上说,字符集就是从人类语言符合集合到计算机符号所表达的整型值集合之间的一个函数映射关系。

 

二、 字符编码的使用情境

当我们说对字符进行编码时,事实上,我们已经可以忽略字符的数值方面,因为此时字符所代表的数值已经没有实际意义。其原因有三:

1、 同一字符在不同字符集映射下的值可能不同。' A'>'B' 这样企图对两个字符比较大小的语句不是总能达到目的的。

2、 我们将人类语言中的符号映射到计算机中,主要的目的是让计算机能够表达和存储人类语言,而非让人类去弄清楚我们的符号在计算机中的值究竟是多少。

3、 进一步的说,数值本身在计算机中的表示是唯一的,不存在编码问题。

所以,一般在与字符打交道时,我们应该考虑编码问题。这样的编码问题主要就两个方向:存和取。存即按那种字符集将人类语言映射到计算机中保存,取即用那种字符集将计算机语言映射到人的语言。

需要注意的是,即使人类头脑中有充分的数值概念,但用语言的形式表达出来的依然是符号而已。

 

三、 如何更好的理解别人和让别人也更好的理解我们

显而易见的是,当我们用一个字符集将数据映射到计算机中保存起来后,如果别人想查看并理解我们的数据,唯一的途径就是用与我们相同的字符集将数据从计算机语言映射到人类语言。字符集就相当于一个密钥,只是大多数情况下,它是公开的。

为了正确解析数据的内容,一般情况下,一个存储单位(比如文件)应该包括其编码方式的说明。当然,不同字符集下的编码方法说明是不同的。

幸运的是,很多事情都无需我们自己动手,大多软件都有这方面的功能。但是对于程序员来说,这应该是我们必须考虑的问题之一。

 

四、 字符编码和解码的使用

1、 编码字符集与字符编码方案的概念

(1) 编码字符集 是抽象字符集合和整数集合之间的映射关系。

(2) 字符编码方案是编码字符集与八位组字节序列之间的映射关系。

编码字符集决定了抽象字符在计算机中的数值大小,而编码方案则确定如何在计算机中存储这个数值。一般将编码字符集和字符编码方案的一个组合称为编码,但需要注意的是,同一种字符集可能有不同的字符编码方案。

字符集与其编码方案在字符的存取过程中的关系如下:

1 )存字符的过程:

 

       原始字符->字符集映射=整型数值->字符编码方案映射=八位组字节序列

     

 

(2) 取字符的过程:

 

     八位组字节序列-> 字符编码方案映射=整型数值->字符集映射=原始字符

 

 

2、 java中的字符编码

一旦将计算机中输入某个字符,它将天生的被某种字符集映射成整型数值,一般这样的字符集是系统默认的字符集。不可能向计算机中输入原始字符,因为它只能表达数值。

我们所能做的就是以何种方式将输入的字符进行编码存储。需要注意的是,一种编码方案往往与某一个或多个字符集相适应。如果我们选择的编码方案与输入字符时的字符集不匹配,那么编码将出现问题。

java 虚拟机中,以默认的 Unicode 字符集映射字符,所以我们在程序存储字符时应该选择支持 Unicode 字符集的编码方案。

3、 java中的字符解码

与字符的编码相对应,字符的解码也包含字符集和字符编码方案两个方面。对于给定已编码的字符,我们需要与其相同的编码方案将其解释成整型数值,再用与其兼容的字符集方能正确解析字符的本来含义。

4、 java中的字符编码转换

Java中的编码转换依赖于 java 语言本身的支持。这样的支持意味着三个方面:

(1) 提供各种字符集的支持。

(2) 提供各种字符编码方案下的字符转换到unicode 字符进行操作的支持。

(3) 提供unicode 字符转换到各种字符编码方案下进行存储的支持。

具体表现在:

(1) 当我们用InputStreamReader 流读数据时,只要指定源数据的编码格式参数,就能顺利的将源数据转换成纯 unicode 字符集下字符。

(2) 当我们用系统提供的输入流进行输出时,java 可以将 unicode 字符转换成本地字符集下字符并进行输出。

(3) 当我们用OutputStreamWriter PrintStream 流写出数据时,只要指定输出数据的编码格式参数,就能将 unicode 字符转换成指定的编码格式进行存储。

总而言之,java 是以 unicode 字符集为桥梁,实现不同字符集和编码方案的相互转换。

除了上述基本功能外,java 还为我们提供了 Charset CharEncoder CharDecoder 抽象类。这三个类分别对应于字符集、字符编码、字符解码三个方面,以便于程序员自定义适应于具体环境和需要的字符编码转换。

 

 

 

原创粉丝点击