IO流-转换流的字符编码转换-ISO-8859-1和utf-8和GBK互转

/*IO流-转换流的字符编码转换-ISO-8859-1和utf-8和GBK互转
编码:字符串变成字节数组

解码:字节数组变成字符串

String-->byte[]:  str.getBytes();
     byte[] getBytes(Charset charset) 
          使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。 

byte[] -->String :  new String(byte[])
    String(byte[] bytes, String charsetName) 
          通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
*/
import java.uitl.*;
class EncodeDemo
{
    public static void main(String[] args) throws Exception
    {

        String s = "你好";

        byte[] b1 = s.getBytes("GBK");//编码:字符串变成字节数组 输入 参数(编码表)
        System.out.println(Arrays.toString(b1));//打印 数组变成字符串 
        String s1 = new String(b1,"ISO8859-1");//解码:字节数组变成字符串,String参数(数组,编码表) 输出
        System.out.println("s1="+s1);

        //对s1进行iso8859-1编码
        byte[] b2 = s1.getBytes("ISO8859-1");//拿乱码的字符串重新编码成字节数组,输入 参数(编码表)
        System.out.println(Arrays.toString(b2));//打印 数组变成字符串 
        String s2 = new String(b2,"gbk");//解码:字节数组变成字符串,String参数(数组,编码表) 输出
        System.out.println("s2="+s2);

    }
}

//ISO8859-1和GBK互转 不会出乱码
        //utf-8和GBK互转会出乱码,参考其他文章,如下
/*

GBK编码是一个中文2个字节,而UTF-8编码是一个中文3个字节,
当我们调用getBytes("UTF-8")方法时,会通过计算来增加字节。
正常的情况下是两个两个的转化,但是当字节是奇数时最后1个字节转字符就会计算错误,
然后直接赋予最后这个字符为?。所以我们需要创建ISO-8859-1编码的字符串,保证一个输入只有一个输出。
*/
import java.io.UnsupportedEncodingException;

public class new_122 {
public static void main(String[] args) throws UnsupportedEncodingException {
    String gbk ="我来了";

    String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");    
    //构造方法 String(byte[] bytes, Charset charset) 
     //     通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。

    //方法 返回byte[]: getBytes(Charset charset) 
    //     使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。 

    //构造方法里面,再加了方法,就是先编码字节数组用UTF-8,再解码字符串用ISO-8859-1

    System.out.println(new String(iso.getBytes("ISO-8859-1"),"UTF-8"));
    //构造方法里面,再加了方法,就是先编码字节数组用ISO-8859-1,再解码字符串用UTF-8

    //总结,用ISO-8859-1做中介编码表 来 实现UTF-8 和GBK 互转,因为ISO-8859-1是单字节的,不会改变数据
    }

}

你可能感兴趣的:(Java,IO)