• Java InputStream 中文乱码


    Java InputStream 中文乱码


    问题描述

    在调用 http POST ,获取请求体中的内容时,如果出现中文,在读取的时候,可能会引起“中文乱码”的现象。

    如下读取方式 引起中文乱码

    public XssRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            this.request = request;
            StringBuilder stringBuilder = new StringBuilder();
            BufferedReader bufferedReader = null;
            try {
                InputStream inputStream = request.getInputStream();
                if (inputStream != null) {
                    // 如下方式读取 InputStream 流,会引发中文乱码问题
                    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    char[] charBuffer = new char[128];
                    int bytesRead = -1;
                    while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                        stringBuilder.append(charBuffer, 0, bytesRead);
                    }
                } else {
                    stringBuilder.append("");
                }
            } catch (IOException ex) {
                throw ex;
            } finally {
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException ex) {
                        throw ex;
                    }
                }
            }
    
            System.out.println("stringBuilder: " + stringBuilder.toString());
    }

    问题原因

    在不设置编码的情况下,InputStreamReader 默认的读取编码是 ASCII 编码中文会转成乱码

    解决方案

    在 InputStreamReader 读取时,需要指定读取的编码格式为 UTF_8 编码

    如下读取方式 不会 引起中文乱码

    public XssRequestWrapper(HttpServletRequest request) throws IOException {
            super(request);
            this.request = request;
            StringBuilder stringBuilder = new StringBuilder();
            BufferedReader bufferedReader = null;
            try {
                InputStream inputStream = request.getInputStream();
                if (inputStream != null) {
                    // 此处需要将编码格式设置为UTF_8,解决 InputStream 流读取时的中文乱码问题
                    bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
                    char[] charBuffer = new char[128];
                    int bytesRead = -1;
                    while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                        stringBuilder.append(charBuffer, 0, bytesRead);
                    }
                } else {
                    stringBuilder.append("");
                }
            } catch (IOException ex) {
                throw ex;
            } finally {
                if (bufferedReader != null) {
                    try {
                        bufferedReader.close();
                    } catch (IOException ex) {
                        throw ex;
                    }
                }
            }
    
            System.out.println("stringBuilder: " + stringBuilder.toString());
    }

     

  • 相关阅读:
    干货—MySQL常见的面试题+索引原理分析!
    如何设计一个百万级的消息推送系统
    【金三银四跳槽季】Java工程师如何在1个月内做好面试准备?
    Nginx实现请求的负载均衡 + keepalived实现Nginx的高可用
    java函数式编程之Supplier
    SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
    Redis创建集群报错
    阿里云服务器Tomcat无法从外部访问
    SSM框架学习之高并发秒杀业务--笔记5-- 并发优化
    在windows上部署使用Redis
  • 原文地址:https://www.cnblogs.com/miracle-luna/p/14248054.html
Copyright © 2020-2023  润新知