java编码,解码。乱码原因及解决办法
程序员文章站
2024-03-13 09:56:51
...
转换流的编码,常见的出现乱码组合
package com.qianfeng.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
* 转换流的编码:
* 常用字符集:
* 中国的:GBK/GB2312--------2个字节
* 欧洲的:ISO8859-1-----不支持中文,但是一个汉字对应1个字节
* 国标:UTF-8----3个字节
* 内部编码:unicode----2个字节
* 美国的:ASCII
*
* 编码:由字符串转成byte的过程
* 解码:由byte转成字符串的过程
* 乱码:在编码与解码的过程中,使用了不同的字符集,造成编码错误.出现了乱码.
*
* 常见的出现乱码的组合:
* 使用GBK编码 ISO8859-1解码 或者 UTF8编码 ISO8859-1解码
*
* 举例:使用GBK编码 UTF8解码 或者 UTF8编码 GBK解码说明转换流的编码问题
*/
public class Demo2 {
public static void main(String[] args) throws IOException {
//写的时候采用utf-8编码
writeData1();
readData1();//使用utf-8字符集
readData2();//使用GBK字符集
//写的时候采用GBK编码
writeData2();
readData3();//使用utf-8字符集
readData4();//使用GBK字符集
}
//写出
//编码格式是utf8
public static void writeData1() throws IOException {
//创建输出流并关联文件 第一个参数是字节输出流 第二个参数是:输出时指定的编码格式
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("utf8.txt"),"utf-8");
outputStreamWriter.write("冰冰");
outputStreamWriter.close();
}
//写出
//编码格式是GBK
public static void writeData2() throws IOException {
//创建输出流并关联文件 第一个参数是字节输出流 第二个参数是:输出时指定的编码格式
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("GBK.txt"),"GBK");//默认GBK
outputStreamWriter.write("冰冰");
outputStreamWriter.close();
}
//读入
//编码格式是utf8
public static void readData1() throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("utf8.txt"),"utf-8");
char[] arr = new char[100];
int num = inputStreamReader.read(arr);
System.out.println("readData1:"+new String(arr,0,num));
inputStreamReader.close();
}
//读入
//编码格式是GBK
public static void readData2() throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("utf8.txt"),"GBK");//默认utf8
char[] arr = new char[100];
int num = inputStreamReader.read(arr);
System.out.println("readData2:"+new String(arr,0,num));
inputStreamReader.close();
}
//读入
//编码格式是utf8
public static void readData3() throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("GBK.txt"),"utf-8");
char[] arr = new char[100];
int num = inputStreamReader.read(arr);
System.out.println(new String(arr,0,num));
inputStreamReader.close();
}
//读入
//编码格式是utf8
public static void readData4() throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("GBK.txt"),"GBK");//默认GBK
char[] arr = new char[100];
int num = inputStreamReader.read(arr);
System.out.println(new String(arr,0,num));
inputStreamReader.close();
}
}
研发中的编码
package com.qianfeng.test;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/*
* 研发中的编码:
*
* * 说明:GBK,UTF-8是支持中文的,ISO8859-1不支持中文
*
* * 编码:
* byte[] getBytes() //对于中文 默认的格式
使用平台的默认字符集将此 String 编码为 byte 序列,
并将结果存储到一个新的 byte 数组中。
byte[] getBytes(Charset charset)
使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
解码:
String(byte[] bytes) //对于中文 默认是格式
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
*
*/
public class Demo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
//使用GBK编码解码
String s1 = "你好";
byte[] bs1 = s1.getBytes("GBK");//编码
System.out.println(new String(bs1,"GBK"));//解码
System.out.println(Arrays.toString(bs1));//[-60, -29, -70, -61]
//使用utf8编码解码
String s2 = "你好";
byte[] bs2 = s2.getBytes("utf-8");//编码
System.out.println(new String(bs2,"utf-8"));//解码
System.out.println(Arrays.toString(bs2));//[-28, -67, -96, -27, -91, -67]
//使用ISO8859-1编码解码
String s3 = "你好";
byte[] bs3 = s3.getBytes("ISO8859-1");//编码
System.out.println(new String(bs3,"ISO8859-1"));//解码
System.out.println(Arrays.toString(bs3));//[63, 63]
}
}
乱码问题的解决办法
package com.qianfeng.test;
import java.io.UnsupportedEncodingException;
/*
* 解决乱码:
* 出现的情况:编码与解码字符集不一致
* 解决办法:通过再编码再解码解决乱码,但是是在保证第一次编码没有问题的前提下.
*
*是否可以采用再编码再解码处理:
* 编码 解码
* GBK UTF8 不可以
* GBK ISO8859-1 可以
* UTF8 GBK 不可以
* UTF8 ISO8859-1 可以
* ISO8859-1 GBK 不可以(编码就出错了)
* ISO8859-1 UTF-8 不可以(编码就出错了)
*/
public class Demo4 {
public static void main(String[] args) throws UnsupportedEncodingException {
//1.GBK编码 UTF-8解码
// String s1 = "你好";
// byte[] bs1 = s1.getBytes("GBK");
// String strbs1 = new String(bs1, "utf-8");
// System.out.println("utf8解码:"+strbs1);//utf8解码:���
//
// //再编码
// byte[] bs11 = strbs1.getBytes("utf-8");
// //再解码
// System.out.println(new String(bs11,"GBK"));//锟斤拷锟�
//2.GBK编码 ISO8859-1解码
// String s1 = "你好";
// byte[] s1b = s1.getBytes("GBK");
// String sr1b = new String(s1b,"ISO8859-1");
// System.out.println("ISO8859-1解码:"+sr1b);//????
//
// //再编码
// byte[] s1bb = sr1b.getBytes("ISO8859-1");
// //再解码
// System.out.println("GBK再编码:"+new String(s1bb,"GBK"));//你好
//3.utf8编码 GBK解码
String s1 = "你好啊";
byte[] s1b = s1.getBytes("utf-8");
String sr1b = new String(s1b,"GBK");
System.out.println("GBK解码:"+sr1b);//浣犲ソ鍙?
//再编码
byte[] s1bb = sr1b.getBytes("GBK");
//再解码
System.out.println("utf8再编码:"+new String(s1bb,"utf-8"));//你好??
//4.utf8编码 ISO8859-1解码
// String s1 = "你好号";
// byte[] s1b = s1.getBytes("utf-8");
// String sr1b = new String(s1b,"ISO8859-1");
// System.out.println("ISO8859-1解码:"+sr1b);//????????·
//
// //再编码
// byte[] s1bb = sr1b.getBytes("ISO8859-1");
// //再解码
// System.out.println("utf8再编码:"+new String(s1bb,"utf-8"));//你好号
}
}
推荐阅读
-
java编码,解码。乱码原因及解决办法
-
编码与解码的java展示以及乱码的原因总结
-
文件路径正确,报java.io.FileNotFoundException异常的原因及解决办法
-
Java在web页面上的编码解码处理及中文URL乱码解决
-
文件路径正确,报java.io.FileNotFoundException异常的原因及解决办法
-
Java在web页面上的编码解码处理及中文URL乱码解决
-
PHP base64编码后解码乱码的解决办法
-
java.sql.SQLException:Unknowncolumn'****'in'whereclause'错误的原因及解决办法
-
java在linux系统下开机启动无法使用sudo命令的原因及解决办法
-
java在linux系统下开机启动无法使用sudo命令的原因及解决办法