黑马程序员——java语言基础部分——编码解码

来源:互联网 发布:卖家怎么淘宝客推广 编辑:程序博客网 时间:2024/06/04 19:26

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

概述:

     编码解码主要是字符与字节之间的转换。

    解码:字节——》字符

     编码:字符——》字节

编码表:

   主要分为以下几种:
  1. ASCII:美国标准信息交换码。用一个字节的后7位来表示。
  2. ISO8859-1:拉丁码表,欧洲码表。用一个字节来表示。
  3. GB2312:中国的中文编码表。
  4. GBK:中国的中文编码表升级后,并融合了更过的中文字符符号
  5.      其中中文用两个字节表示,且这两个字节的最高位都是1,也就是说是由两个负数组成的。
  6. Unicode:国际标准码表,融合了世界各地的语言文字,且所有的文字都是用两个字节表示,包括字母等。
  7. UTF-8:一种灵活的编码表,如果文字可以用一个字节表示就用一个字节表示,如果要用两个字节表示就用两个字节表示,......,最多只能用三个字节来表示。

注意:
  • 中文码表兼容ASCII
  • Unicode是java文件中使用的默认语言。
  • UTF-8码表的标识头:单字节的标识头是0,两个字节时的标识头是:两个字节的最高位分别是110、10,三个字节时的标识头是:三个字节的最高位分别是1110、110、10
  • ISO8859-1码表不识别中文

转换

    字节与字符之间的转换主要是通过IO体系中的转换流InputStreamReader、OutputStreamWriter来实现的。
    InputStreamReader:字节——》字符
    它使用指定charset读取字节并将其解码为字符。所使用的字符集可以由名称指定或显示给定,或者接收平台默认的字符集。并提供了close()关闭流释放资源、read()读取单个字符等方法,其中read方法的调用都会导致从底层输入流读取一个或多个字节,要启动从字节到字符的有效转换,提高效率可以使用缓冲流机制。
    OutputSteamWriter:字符——》字节
    它使用指定的charset将要写入流中的字符编码成字节,他使用的字符集可以由名称指定或显示给定,否则将接收平台默认的字符集。并提供了flush(),read()等方法,其中每次调用write()方法都会导致在给定字符或字符集上调用编码转换器。在写入底层输出流之前,得到的字节将在缓冲区累计。要想提高效率也可以使用缓冲流机制。
下面以代码为例来解释:
从运算的结果可以看出unicode编码字节数有8个,但是“你好A”字符串,unicode编码应该是6个,这里还有两个字节分别是-2和-1在最前面,我们通过Arrays.toString("你好A".getBytes("Unicode"))得到的结果是[-2, -1, 79, 96, 89, 125, 0, 65],所以字符串的Unicode编码的结果是在按照每个文字用两个字节表示的基础上加上2.

GBK与UTF-8的特例

“联通”的GBK编码的字节的最高位刚好是110、10刚好符合UTF的标识头,所以当我们的在文本文件中编辑联通,然后保存,再打开的时候就会是乱码,这是因为系统可能会认为联通的编码方式是UTF-8,故会在解码的时候出现无法解码,从而出现乱码。解决的办法是在“联通”前面写入其他的汉字或者字符。

0 0
原创粉丝点击