在基於 HTTP 協議的 JSP 或 Servlet 應用中,JVM 預設會將傳輸的資料編碼為 UTF-8 格式。若直接從 HTTP 流中提取中文資料,往往會得到亂碼(如「????」)。為了正確解析中文字符,必須將 UTF-8 轉換為 GB2312 編碼。
利用 ISO-8859-1 作為中介編碼,可輕鬆實現轉換。以下代碼示範了標準做法:
byte[] b;
String utf8_value;
utf8_value = request.getParameter("NAME"); // 從 HTTP 流取得 UTF-8 資料
b = utf8_value.getBytes("8859_1"); // 以 ISO-8859-1 為中介
String name = new String(b, "GB2312"); // 轉換為 GB2312 字符
雖然 InputStream.read(byte[] b, int off, int len) 允許一次讀取指定長度,但在網路環境下資料傳輸可能斷續,無法保證一次讀完所有資料(尤其大數據量時)。因此必須採用循環讀取,並檢查實際讀取的位元組數:
int totalRead = 0;
while (totalRead < expectedLength) {
int read = inputStream.read(buffer, totalRead, expectedLength - totalRead);
if (read == -1) break; // 流結束
totalRead += read;
}
這樣才能確保資料完整性,避免因網路波動導致讀取不全。