缘由:
编解码不一致致使字符乱码。
起首,我们能够经由历程挪用java.nio.charset.Charset.defaultCharset()
取得体系的默许字符集,中文Windows体系都是GBK,所以JVM默许都是以GBK字符集来举行编解码。
相干视频进修教程:java教授教养视频
乱码发生最大的能够性在于编解码不一致。
// 代码片断1: byte[] read = "你好abc".getBytes(); String result = new String(read); System.out.println(result);
上诉这段代码一共有3步:
1、编码。这里为了看起来更简约就这样写,事实上和你从文件/收集等其他序言读取是一样的,底本输入流是什么范例编码,读取后也是什么范例编码。这里没有指定编码体式格局,所以默许为GBK。
2、解码。我们终究的操纵都是字符串对象,能够经由历程指定字符串的对字节数组的解码体式格局,终究取得一个字符串对象。这里没有指定解码体式格局,所以默许为GBK。
3、输出、运用字符串。事实上这里另有一次编解码历程,就是输出流编码为GBK,控制台解码为GBK,终究显现。由于输出、运用字符串时都是以体系默许字符集举行,不存在编解码不一致的能够,所以这里不会是乱码泉源。
假定我们将输入流的编码改一下:
// 代码片断2: byte[] read = "你好abc".getBytes("utf-8"); String result = new String(read); System.out.println(result);
再来剖析一下3步:
1、编码,utf-8;
2、解码,gbk。
编解码不一致,这里便发生了乱码。
至于怎样修复,置信已很清晰了。
修复要领以下:
// 代码片断3: byte[] read = "你好abc".getBytes("utf-8"); String result = new String(read,"utf-8"); System.out.println(result);
将解码体式格局改成与编码对应就能够了。
小结:
1、我们平常比较难控制输入流是什么编码,所以注重解码时与输入流的编码范例一致即可。我们平常在挪用输入流的相干要领看到有charset参数,就是指解码体式格局。
2、输出流一样能够操纵其编码体式格局,假如后续会以输入流操纵这个输出的效果,比如说文件,只需都以默许的体式格局举行,便不会发生乱码。我们平常在挪用输出流的相干要领看到有charset参数,就是指编码体式格局。
引荐相干文章教程:java入门教程
以上就是java中的字符涌现乱码的细致内容,更多请关注ki4网别的相干文章!