Java使用UTF-8或GBK编码后还是乱码的问题

在开发中,转换String到byte[]时常需指定字符集如GBK或UTF-8。乱码由编码解码字符集不一致引起。示例代码显示指定编码解码字符集以避免问题。Charset.defaultCharset()在JVM启动时设置且不可变,而System.getProperty(file.encoding)可运行时修改但重启后失效。两者获取的默认字符集不同。

大家在开发中可能经常遇到将String字符串转为byte[]的场景,为了避免中文乱码,一般指定字符集为GBK或UTF-8来进行编码以及解码,但是如果使用不当,同样会造成字符集乱码问题。
主要原因是进行编码以及解码的字符集不一致导致
所以,在解决字符集乱码问题时一般情况下会显示指定编码和解码字符集。

// 编码
byte[] bytes = “中文”.getBytes(“UTF-8”);
// 解码
new String(bytes,“UTF-8”);

不显式指定时一般会使用默认字符集进行编码或解码,此时需要确保使用的获取默认字符集的方法一样。

// 编码 获取默认字符集方法为:Charset.defaultCharset().name()
byte[] bytes =“中文”.getBytes();
// 解码 获取默认字符集方法为:Charset.defaultCharset().name()
new String(bytes);

以下列出两种获取默认字符集的方法及区别:

Charset.defaultCharset().name();
System.getProperty("file.encoding")

两者的区别是:

  • **Charset.defaultCharset()**通过在JVM启动时通过-Dfile.encoding=UTF-8参数来进行设置。此方式只支持在jvm启动时设置一次,不支持在运行期修改。

  • System.getProperty(“file.encoding”) 获取的是操作系统的编码,可以通过System.setProperty("file.encoding","UTF-8")进行修改(此修改不会影响操作系统,重启jvm后丢失),支持在运行期修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值