详解 编码和解码

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

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


编码:

定义:

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

简单来讲,就是:
把看得懂的变成看不懂的: 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://blog.csdn.net/weixin_45238600/article/details/104170259
(本人“I/O流”总集篇博文链接:https://blog.csdn.net/weixin_45238600/article/details/104153031

发布了118 篇原创文章 · 获赞 82 · 访问量 5191

猜你喜欢

转载自blog.csdn.net/weixin_45238600/article/details/104184270