• 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());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    二、问题原因

    在不设置编码的情况下,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());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

  • 相关阅读:
    实用工具在线网站
    c语言进阶:指针的进阶(下)
    java计算机毕业设计喜枫日料店自助点餐系统源码+lw文档+系统+数据库
    带指令的embedding是否更配RAG?
    程序员属于什么阶级?上升空间如何?
    “三行代码,确实需要耗上一整天!”
    iOS 控制网络请求顺序
    操作系统——进程同步和进程互斥中的经典问题
    Verilog 随机数及概率分布
    Android:使用Jetpack Compose画渐变背景
  • 原文地址:https://blog.csdn.net/aikudexiaohai/article/details/133225142