重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天就跟大家聊聊有关java字符出现乱码的原因和解决方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联建站基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业德阳机房托管报价,主机托管价格性价比高,为金融证券行业服务器托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。
原因:
编解码不一致导致字符乱码。
首先,我们可以通过调用java.nio.charset.Charset.defaultCharset()
获得系统的默认字符集,中文Windows系统都是GBK,所以JVM默认都是以GBK字符集来进行编解码。
乱码产生最大的可能性在于编解码不一致。
// 代码片段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字符出现乱码的原因和解决方法有进一步的了解吗?如果还想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读。