关于微信小程序与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
      },

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

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

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

/**
 * 微信解析手机号
 * @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;
}

结果小程序端显示的用户名为“寮犱笁”。
起初怀疑后台返回的编码格式不对,网上说对于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;
}

结果还是不行,另有说需要在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());
    }

然而并无卵用,到底是怎么回事呢,在小程序端打印一下响应格式看看:
关于微信小程序与Java后台交互数据中中文乱码问题的讨论_第1张图片
可以看到小程序端已经是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;

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

你可能感兴趣的:(java,微信小程序,开发语言)