問題描述
在調用 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()); }