记录解决问题--GBK转UTF-8时,奇数个中文会乱码,偶数个中文不会乱码

1.原因

中文s,gbk转utf-8会扩展字节,中文utf-8字节转gbk,最后一个字节格式不对,直接转为了?(63),再将带问号中文gbk转utf-8字节,最后一个字节就变成了63,输出utf-8的中文最后就乱码了。
清晰原文链接
其实:中文,只要getBytes和new String都是一样的编码,无论如何都不会乱码。而乱码的原因就是其中几种编码之间转换不识别,导致字节码发生了变化,字节码对应的中文就变了,就乱码了。

2.示例

借用网上的一个例子。VM options里面加-Dfile.encoding=GBK,模拟gbk的容器。

    public static void main(String[] args) throws UnsupportedEncodingException {
        String gbk = "我来了";
        String utf8 = new String(gbk.getBytes("UTF-8"));  //这里将utf-8的字节码,翻译为gbk的中文,最后一个字节翻译成了?(63),此时utf8.getBytes()或utf8.getBytes("UTF-8")与gbk.getBytes("UTF-8")得到的字节是不一样了

        //模拟UTF-8编码的网站显示
        System.out.println(new String(utf8.getBytes(),"UTF-8"));

    }

调试图

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值