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

时间:2023-01-10 22:22:05
/*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是单字节的,不会改变数据
}

}