详解 编码和解码

(请观看本人博文——《详解 字符流》

在我们的日常编程中,经常会遇到 乱码 的问题,这是什么原因呢?
这个问题就牵扯到了本篇博文的主题 —— 编码与解码



编码:

定义:

所谓 编码, 就是把 字符串 转换成 字节数组

简单来讲,就是:
把看得懂的变成看不懂的: String -- byte[]

那么,根据本人上述所讲,差不多就可以明白,我们编码所用的方法就是:

String类的getBytes()方法:

  • byte[] getBytes()
    使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
  • byte[] getBytes(Charset charset)
    使用给定的 charset字符集 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组
  • byte[] getBytes(String charsetName)
    使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
  • void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)
    已过时。 该方法无法将字符正确转换为字节。从 JDK 1.1 起,完成该转换的首选方法是通过 getBytes() 方法,该方法使用平台的默认字符

解码:

定义:

所谓 编码, 就是把 字节数组 转换成 字符串

简单来讲,就是:
把看不懂的变成看得懂的: byte[] -- String

那么,根据本人上述所讲,差不多就可以明白,我们编码所用的方法就是:

String类的构造方法:

  • String(byte[] bytes)
    通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
  • String(byte[] bytes, Charset charset)
    通过使用指定的 charset字符集 解码指定的 byte 数组,构造一个新的 String
  • String(byte[] bytes, int offset, int length)
    通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String
  • String(byte[] bytes, int offset, int length, Charset charset)
    通过使用指定的 charset字符集 解码指定的 byte 子数组,构造一个新的 String
  • String(byte[] bytes, int offset, int length, String charsetName)
    通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String
  • String(byte[] ascii, int hibyte, int offset, int count)
    已过时。 该方法无法将字节正确地转换为字符。从 JDK 1.1 开始,完成该转换的首选方法是使用带有 Charset、字符集名称,或使用平台默认字符集的 String 构造方法
  • String(byte[] ascii, int hibyte)
    已过时。 该方法无法将字节正确地转换为字符。从 JDK 1.1 开始,完成该转换的首选方法是使用带有 Charset、字符集名称,或使用平台默认字符集的 String 构造方法

本人现在来给出一个例子,来展示下编码和解码的过程:

package edu.youzg.about_io.about_file.core;

import java.io.UnsupportedEncodingException;

public class Test {

    public static void main(String[] args) throws UnsupportedEncodingException {

        String str="音无结弦之时";
        byte[] bytes = str.getBytes(); //采用默认的码表进行编码
        String s = new String(bytes);//采用 默认的码表进行解码
        System.out.println(s);

        //可以 指定码表进行编解码
        String str2="悦动天使之心";
        byte[] bytes1 = str2.getBytes("gbk");
        //解码
        String s1 = new String(bytes1,"gbk");
        System.out.println(s1);
    }

}

那么,本人来展示下输出结果:
在这里插入图片描述

那么,现在,本人再来讲解下我们经常会遇到的问题 —— 乱码

乱码:

原因:

编/解码 用的不是同一个码表

那么,现在本人就来展示下不用同一张码表的输出结果:

package edu.youzg.about_io.about_file.core;

import java.io.UnsupportedEncodingException;

public class Test {

    public static void main(String[] args) throws UnsupportedEncodingException {
        //编码
        String str = "立于浮华之世,奏响天籁之音";
        byte[] bytes = str.getBytes("gbk");
        //解码
        String s = new String(bytes,"utf-8");
        System.out.println(s);  //出现乱码
    }

}

那么,本人现在来展示下运行结果:
在这里插入图片描述
我们可以清晰地看到 —— 由于我们编/解码所用的码表不同,所以出现了乱码!

(本人《详解 字节流 与 字符流》博文链接:https:////www.cnblogs.com/codderYouzg/p/12418532.html
(本人 I/O流总集篇 博文链接:https:////www.cnblogs.com/codderYouzg/p/12418404.html

posted @ 2020-03-05 09:51  在下右转,有何贵干  阅读(413)  评论(0编辑  收藏  举报