黑马程序员--字符流与编码学习

来源:互联网 发布:软件红蜘蛛 编辑:程序博客网 时间:2024/05/22 14:32


              ------android培训、java培训期待与您交流! ---------
说到字符流,就先来了解一下字符的有关知识
什么是字符集? 
 字符(Character):是文字与符号的总称,包括文字、图形符号、数学符号等。 
 l 字符集(Charset):就是一组抽象字符的集合。  
   字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集
、日文汉字字符集。字符集的子集也是字符集。
  计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符 l 编码(Encoding):制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据
字符集内字符的多少,会确定用几个字节来编码。 每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多是这个
含义。




   下面来说说java中的字符集与编码,大家都清楚Java使用的是UNICODE字符集。UNICODE是一套字符集而非编码标准。UNICODE字符集并非一直不变,目前流行使用的版本是使用2个字节来存储理论数量
为256x256=65535(个)的字符集。两个字节能表示的范围也就是这个数字,以16进制表示就是0x0000-0xFFFF。这65535(个)已经足够收录目前世界上主要语言的大多数字符了,保证日常通信是没问题的。




  我们在来看看一个中文字符在java内存中是如何存储的(注意,java中是以字符所代表的数字存放在内存中的): 如下 
char ch1 = '汉'  int nch1 = (int)ch1   System.out.println("汉
:" + Integer.toHexString(nch1)); 运行结果为:汉:6c49。  也就是说“汉”这个字符在内存中实际上是占用了两个字节的空间,一个字节存放的是“6C”而另一个字节存放的是“49”。这个十六进
制数“0x6c49”所代表的数字则是在UNICODE字符集标准中“汉”这个字对应的数字值。
 Java中UNICODE字符集是表示在内存中的字符的编码,是和String类紧密相关的。一旦一个字符串建立,这些字符在内存中所存放的十六进制数就是根据UNICODE而来。在不需要写入文件和网络传输的情
况下它的编码都是统一的。换句话说String类在处理字符的时候会将对象自身存储的“字节数组”以UNICODE来分析,两两字节来读取,将两个字节作为一组当成一个字符来处理。因此如果数据只是在内
存中。不需要和外界操作系统进行交互,只在java内存中操作的话,是不会有转码问题的。
    当然,数据不会只是在内存中使用。通常要对数据进行保存,读取,打印,输入等等操作。这时就要考虑到编码转码问题了。读取控制台输入的字符时不需要进行编码指定,因为控制台接收数据后
所存放的编码不会被用户更改,所以只要用系统默认的编码进行转化就可以正确处理.当处理的是文件的时候就复杂一点了,因为文件中字符串的编码并不肯定是系统默认的编码。这个时候用户在读取的
时候可以指定某一种编码来读取,使用InputStreamReader类,它有设置编码的构造方法。

  

  Java在输出到系统显示时,会把内存中变量字符再通过系统默认语言(字符集)编码去转换,所以在输出过程中也会碰到一系列的编码问题。

 有了以上知识,字符流就好理解了。字符流作用就是传输信息时对字节进行编码解码。java中字符流按照二个字节传输 ,由于字符流使用Unicode字符集,支持多国文字,因此若流要跨越多种平台传输
应使用字符流。另外一点还要说明所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
--------android培训、java培训期待与您交流! ---------
原创粉丝点击