记一次编码乱码问题

背景描述:使用idea2019,tomcat 1.7.06。编写接口通过postman  post请求参数乱码问题。

废了多半天的时间解决这个问题。通过postman 参数为{"statisticalCaliber":"北京"}  传递到后台(

@RequestMapping(value = "/usersInfo", method = RequestMethod.POST, headers = "Accept=application/json;charset=UTF-8") //
@ResponseBody
public Object usersInfo(HttpServletRequest request,HttpServletResponse response) throws Exception {}

后台以流的形式接收。

public static JSONObject getMsgObject(HttpServletRequest request){
    
    try {
        String str = readRaw(request.getInputStream());
        String result = StringEscapeUtils.unescapeHtml(str);
        if(StringUtils.isNotBlank(result)){
            JSONObject jsonData = JSONObject.fromObject(result);
            return jsonData;
        }else{
            return null;
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }
    
}
public static String readRaw(InputStream inputStream) {
    String result = "";
    try {
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];

        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            outSteam.write(buffer, 0, len);
        }

        result = new String(outSteam.toByteArray(), "UTF-8");
        outSteam.close();
        inputStream.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}

后台接收为一个中文变成2个?并且 双引号变成&quot。百度了很多资料都不行。下面是我整理的解决办法,亲测有效。

getMsgObject方法就是返回的参数json。

1、首先是编辑器的乱码,这个很好解决,file->settings->appearence里面有个Use custom font设置成支持中文的字体的 -->Microsoft Yahei(idea本身的字体可能导致控制台中文乱码)。

2、在 idea下 file -> setting -> editor -> file encodings -> global encoding ,project encoding及properties的编码设置为utf-8。

3、File->Other Settings->Default Settings ->Editor->File Encodings。

4、将项目中的.idea文件夹中的encodings.xml文件中的编码格式改为uft-8,检查一下。

5、File->Settings->Build,Execution,Deployment -> Compiler -> Java Compiler   设置 Additional command line parameters选项为 -encoding utf-8。

6、打开idea的tomcat 配置,在运行配置上加上 VM options 加上:-Dfile.encoding=UTF-8。保存。

7、idea bin目录下的idea64.exe.vmoptions(64位系统,32位配置idea.exe.vmoptions),在文件末尾添加:

-Dfile.encoding=UTF-8。这是网上大多数的说法,但是通过HELP->Edit Custom VM OPtions中加 -Dfile.encoding=utf-8打开看的话,之前的设置并没有设置成功,可能是破解等其他原因。所以再次通过HELP->Edit Custom VM OPtions中

加 -Dfile.encoding=utf-8 。关闭所有的idea,重启,这个很重要。

8、启动项目,发现json中文参数乱码问题解决了,但是双引号为&quot 的问题还存在。

通过

StringEscapeUtils.unescapeHtml(str);  解决。

9、json参数的解析正常了,但是idea的启动以及报错日志乱码。

去Tomcat安装目录下 的conf文件夹去Tomcat安装目录下 的conf文件夹找到logging.properties文件,修改java.util.logging.ConsoleHandler.encoding =utf-8为 java.util.logging.ConsoleHandler.encoding = GBK;

10、重启。启动日志不乱码了,但是报错日志乱码。修改为java.util.logging.ConsoleHandler.encoding =utf-8

    文件解决。

11、另外这只是针对上面的这种情况的解决办法,发生上述问题其实是因为对postman原理不是很了解,也可以用另外一种方法。

@RequestMapping(value="/search",method=RequestMethod.POST)
@ResponseBody
public void doSearchPost(HttpServletRequest request,HttpServletResponse response) throws Exception{}

只不过postman使用时用下面这种调用,参数可以正常接收

以上为我本次遇到乱码的全部解决方案,至于原理还得继续学习。希望对大家有所启发和帮助。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值