首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 編碼轉換實戰:UTF-8 ↔ GB2312 互轉與輸入流安全讀取完全指南

     編輯:Java 程式設計入門

HTTP 請求中文亂碼根因與解法

Servlet 容器預設以 ISO-8859-1 解碼 URL 參數,導致中文變「????」。標準三步走轉碼:

String utf8Param = request.getParameter("name");      // 實為 ISO-8859-1 位元組序列
byte[] bytes = utf8Param.getBytes("ISO-8859-1");      // 還原原始位元組
String gb2312 = new String(bytes, "GB2312");          // 按真實編碼重組

若容器已支援 request.setCharacterEncoding("UTF-8")(Tomcat 5+ 需在 server.xml 設 URIEncoding="UTF-8"),可直接取得正確字串。

已知長度輸入流安全讀取

網路流可能分多次到達,單次 read() 不保證讀滿,必須循環累積:

ServletInputStream in = request.getInputStream();
int size = request.getContentLength();
byte[] buffer = new byte[4096];
byte[] result = new byte[size];
int offset = 0, read;
while (offset < size && (read = in.read(buffer)) != -1) {
    System.arraycopy(buffer, 0, result, offset, read);
    offset += read;
}
// result 即完整請求體

未知長度輸入流轉位元組陣列

善用 ByteArrayOutputStream 自動擴容:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
    baos.write(buf, 0, len);
}
byte[] data = baos.toByteArray();

最佳實務建議

  • 統一專案編碼為 UTF-8(資料庫、頁面、容器、Java 原始檔),杜絕轉碼痛點。
  • 大量資料流處理考慮 BufferedInputStream 包裝提升效能。
  • 檔案上傳請使用成熟庫,手寫解析 multipart/form-data 易出錯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved