java|关于微信小程序与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 = "https://www.it610.com/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 = "https://www.it610.com/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> responseBodyConverter() { return new StringHttpMessageConverter(Charset.forName("UTF-8")); }@Override public void configureMessageConverters(List> converters) { converters.add(responseBodyConverter()); }

【java|关于微信小程序与Java后台交互数据中中文乱码问题的讨论】然而并无卵用,到底是怎么回事呢,在小程序端打印一下响应格式看看:
java|关于微信小程序与Java后台交互数据中中文乱码问题的讨论
文章图片

可以看到小程序端已经是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|关于微信小程序与Java后台交互数据中中文乱码问题的讨论
文章图片

代码里直接写的“张三”,打印出来居然是:寮犱笁。难度是文件编码不对?
java|关于微信小程序与Java后台交互数据中中文乱码问题的讨论
文章图片

可是IDEA显示的是UTF-8啊,难到是工程设置的问题:
java|关于微信小程序与Java后台交互数据中中文乱码问题的讨论
文章图片

工程设置也是UTF-8,但是上面有个Participant.java文件设置的是GBK,一个工程里面编码不统一,难道是这个原因引起的?赶紧把上面的GBK设置删除,重新编译运行还是不行啊,重启IDEA试试:
java|关于微信小程序与Java后台交互数据中中文乱码问题的讨论
文章图片

终于看到久违的“张三”了!明明设置工程为UTF-8,可居然因为一个文件设置不同导致整个工程以GBK格式编译的,这像是IDEA本身的bug,我用的是IDEA2018.3.5,可,能是老版本的原因了,不知新版本有没这个问题,先记录下来。

    推荐阅读