zoukankan      html  css  js  c++  java
  • 详解 编码和解码

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

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



    编码:

    定义:

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

    简单来讲,就是:
    把看得懂的变成看不懂的: 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

  • 相关阅读:
    XML实例入门2
    XML入门
    XML实例入门1
    C语言复合梯形公式实现定积分
    一些界面库比较以及如何选择界面库
    网络阅读开篇
    vs2008 edit spin 十六进制实现
    jquery操作cookie
    Excel导入到DataTable
    SQL 查找某个字段的首字母
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12418563.html
Copyright © 2011-2022 走看看