專案中傳遞含中文與特殊字元的 QueryString 時,常混淆 Server.HtmlEncode 與 Server.UrlEncode。本文系統比較兩者編碼規則、輸出差異與適用場景。
&→&、<→<、>→>、"→"、'→'、非 ASCII 字元 → xxx; (數值實體)。DK51700中繼站 → DK51700中练站 (頁面原始碼);瀏覽器顯示正常中文。+,保留字元 (; / ? : @ & = + $ ,) 視情境編碼,非 ASCII → UTF-8 位元組 %XX 序列 (預設系統編碼頁,可指定 UTF-8)。DK51700中繼站 → DK51700%D6%D0%BC%C6%D5%BE (網址列);瀏覽器自動解碼顯示中文。| 特性 | HtmlEncode | UrlEncode |
|---|---|---|
| 目標上下文 | HTML 內容/屬性值 | URL 路徑/QueryString/POST Body |
| 空格處理 | 不變 (或 ) | + (或 %20) |
| 非 ASCII | 數值實體 nnnn; | UTF-8 %XX 序列 |
< 處理 | < | %3C |
| 解碼對應 | HtmlDecode | UrlDecode |
| 瀏覽器自動解碼 | 否 (需 HTML 解析器) | 是 (網址列/表單提交) |
< 導致伺服器解析參數錯誤 (如 ?q=DK51700%u4e2d<p%u4e2d 被解析為兩個參數)。%3Cscript%3E 直接輸出至 HTML,瀏覽器不解碼,顯示亂碼,且若經雙重解碼可能觸發 XSS。UrlEncode(HtmlEncode(s)) 需 HtmlDecode(UrlDecode(s)),順序顛倒即失敗。實測混合 HTML 標籤字元時的 ASP.NET 要求驗證攔截行為,並提供 Base64、雙重編碼、POST Body 等解決方案。