自製 ServerSocket 接收 HTTP POST 請求,使用 new String(bytes, 0, bytes.length) 解碼,中文變為 %B2%E3%D5... 類似 URL 編碼格式。
瀏覽器提交表單時,預設使用 application/x-www-form-urlencoded 編碼,會將非 ASCII 字元轉為 %XX 形式。伺服端收到的是已編碼的位元組流,直接按預設字元集(如 ISO-8859-1 或 UTF-8)轉字串,會得到「雙重編碼」的亂碼。
java.net.URLDecoder.decode(str, "UTF-8")(或對應字元集)將 %XX 還原為原始字元。ISO-8859-1 轉字串(保證位元組不丟失),再 URLDecoder.decode。String raw = new String(bytes, "ISO-8859-1");
String decoded = URLDecoder.decode(raw, "UTF-8");
理解 HTTP 表單編碼機制,是網路程式開發的基礎必修課。