• 小结getBytes()默认编码导致的xml字符串中出现乱码


    遇到乱码第一印象想到的是如何统一编码,很少注意到这期间穿插的某些过程也是一大隐患..

    sae上部署了一个spring写的微信小程序,手机总关注测试号点击菜单得到的文本消息却是乱码..

    聚焦发送消息的部分代码:

    response.setCharacterEncoding("utf-8");
    response.getOutputStream().write(result.getBytes());

    编码已经设置为utf-8,spring也加了过滤器进行utf-8的解码...而且控制台也的确打印出没有乱码的发送信息..想当然的认为这头一定没问题..

    然后只好写个测试代码从获得数据的那头获取:

    entity = new StringEntity(doc.asXML());
    post.setEntity(entity);
    HttpResponse response = client.execute(post);
    String result = EntityUtils.toString(response.getEntity());
    System.out.println("结果:"+result);

    结果得到的就是乱码,如果接收方代码如下改则不会乱码:

    String result = EntityUtils.toString(response.getEntity(),"gbk");

    证明乱码部分发过来的是gbk的..我的确是有点蒙了,下午被sae的坑人环境坑了大半天脑袋早木了..又细想了一下既然发过来是乱码,编码的时候又是正常的,那也只可能是getBytes()这一处能出问题了,也只有这一处动过编码后的字符串..看看api说明吧:

    Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array. 

    我倒了..这才恍然大悟,我本地是windows系统,默认是gbk,所以此处会将那部分中文按照gbk编码然后传过去,因为我们response.setXX("utf-8")了,所以接收方按照utf-8来解码,直接乱码..

    所以我们应该改成:

    response.setCharacterEncoding("utf-8");
    response.getOutputStream().write(result.getBytes("utf-8"));

    则接收方无需做任何处理便可得到没有乱码的中文..

  • 相关阅读:
    构造方法
    方法调用时参数传递问题
    空指针异常
    Go安装,配置
    干货-MySQL
    websocket
    Tornado的使用
    socket客户端异步、socket服务端异步
    celery分布式队列实现:实时显示任务执行到哪一步
    celery+django实践
  • 原文地址:https://www.cnblogs.com/chyu/p/4276078.html
Copyright © 2020-2023  润新知