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());
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM