• 关于微信小程序与Java后台交互数据中中文乱码问题的讨论


    小程序端请求参数中含有中文

    如果小程序端发起的请求参数中含有中文,直接发送到后台会显示乱码,需要在header中设置UTF-8编码

     wx.request({
          url: app.globalData.server_url + "wxTest",
          method: 'post',
          header: {
            "Content-Type": "application/x-www-form-urlencoded;charset=utf-8"
          },
          data: {
            srctPhone: srctPhone
          },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这样后台接收到的中文就能解析正常了

    后台返给小程序的数据中含有中文

    为了便于测试,后台接口简化如下:

    /**
     * 微信解析手机号
     * @param srctPhone
     * @return
     */
    @PostMapping(value = "/wxTest")
    public Map wxTest(String srctPhone) {
        Map map = new HashMap();
        map.put("code", 200);
    
        JSONObject obj = new JSONObject();
        obj.put("phoneNumber", "13512911111");  // 手机号明文
        obj.put("userName", "张三");            // 测试中文
        map.put("data", obj);
        return map;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果小程序端显示的用户名为“寮犱笁”。
    起初怀疑后台返回的编码格式不对,网上说对于Springboot的@RestController注解,可以使用produces强制进行修改返回数据的格式,修改如下:

    @PostMapping(value = "/wxTest", produces = "application/json;charset=utf-8")
    public Map wxTest(String srctPhone) {
        Map map = new HashMap();
        map.put("code", 200);
    
        JSONObject obj = new JSONObject();
        obj.put("phoneNumber", "13512911111");  // 手机号明文
        obj.put("userName", "张三");            // 测试中文
        map.put("data", obj);
        return map;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果还是不行,另有说需要在WebMvcConfiguration类中进行统一配置:

    @Component
    public class WebMvcConfiguration implements WebMvcConfigurer {
    
        @Bean
        public HttpMessageConverter<String> responseBodyConverter() {
            return new StringHttpMessageConverter(Charset.forName("UTF-8"));
        }
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(responseBodyConverter());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    然而并无卵用,到底是怎么回事呢,在小程序端打印一下响应格式看看:
    小程序端打印信息
    可以看到小程序端已经是application/json;charset=utf-8类型了,居然姓名还是乱码,真是让人抓狂啊!!!
    今天突发奇想,是不是后台传输的数据格式本身就不对啊,打印一下看看:

    JSONObject obj = new JSONObject();
    obj.put("phoneNumber", "13512911111");  // 手机号明文
    obj.put("userName", "张三");            // 测试中文
    System.out.println("userName: 张三");
    map.put("data", obj);
    return map;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    打印结果:
    打印结果
    代码里直接写的“张三”,打印出来居然是:寮犱笁。难度是文件编码不对?
    文件编码
    可是IDEA显示的是UTF-8啊,难到是工程设置的问题:
    工程设置
    工程设置也是UTF-8,但是上面有个Participant.java文件设置的是GBK,一个工程里面编码不统一,难道是这个原因引起的?赶紧把上面的GBK设置删除,重新编译运行还是不行啊,重启IDEA试试:
    打印信息
    终于看到久违的“张三”了!明明设置工程为UTF-8,可居然因为一个文件设置不同导致整个工程以GBK格式编译的,这像是IDEA本身的bug,我用的是IDEA2018.3.5,可,能是老版本的原因了,不知新版本有没这个问题,先记录下来。

  • 相关阅读:
    Eureka-server集群都挂了,微服务之间还能调通吗
    oracle,CLOB转XML内存不足,ORA-27163: out of memory ORA-06512: at “SYS.XMLTYPE“,
    QFramework 常用
    低代码软件简介及推荐列表
    神仙级Python入门教程(非常详细),从零基础入门到精通,从看这篇开始
    Windows手动清理C盘
    Linux系统之file命令的基本使用
    制药企业计算机化系统验证(CSV)的重要性
    DER编码
    C++信息学奥赛1184:明明的随机数
  • 原文地址:https://blog.csdn.net/xinxin_2011/article/details/126266094