java中的字符采用的是Unicode编码,每个字符都占用两个字节,我们直接将每个字符中的内容对应着的整数打印出来,显示的结果就是这个字符的Unicode码。String类中的getBytes方法,并不是简单地将字符串中的每个字节数据存放在一个字节数组中去,而是将Unicode码的字符串中的每个字符数字,转换成该字符在指定的字符集下的数字,最后将这些数字存放在一个字节数组中返回。将一个字符的Unicode转换成某种本地字符集码的过程叫做编码,将Unicode码成功地转换到本地字符集码,在JDK中必须有对应的字符集编码器类。
将键盘字节输入流中的每个字节读取到一个字节数组中,然后将字节数组中的数据当做某种本地字符集码转换成Unicode吗的字符串,这个过程叫做解码。要能够正确地完成解码工作,在JDK包中必须有对应的字符集解码器类。
注意:先将字节数组解码成字符串,以后还可以将这个字符串又反向编码成最初的字符数组;但是先将一个字符串的内容解码成字节数组,却不一定能够反向解码成最初的字符串。为什么呢?因为一个字符占两个字节,字符串中的原来两个字节的内容按ISO8859-1编码后只有一个字节,两个字节能够表示65536个数字,一个字节只能表示256个值,这个编码不能一一对应,所有会有数据丢失。
字节用于表示计算机内存中最原始的数据,不会涉及到编码问题,只有把字节中的内容当做字符来处理,才会涉及到编码的问题,所以InputStreamReader、InputStreamWriter、PrintStream、String中都有一个可以指定字符集编码参数的构造函数,而InputStream的构造函数中则不存在参数。
转载请注明原文地址: https://ju.6miu.com/read-9495.html