在 ASP.NET 開發中,經常需要將字串轉換為 HTML 十進制實體編碼(數字; 格式),或將已編碼的字串還原為原始文字。這種編碼方式將每個字元轉換為其對應的 Unicode 碼位(十進制數值),並在前後加上 與 ;,瀏覽器會自動解析並顯示為原始字元,適用於防止 XSS 攻擊、安全傳輸特殊字元等場景。
編碼時逐字元取得 Unicode 碼位,解碼時使用正則表達式匹配 (\d+); 模式並還原字元。以下提供完整的 C# 實作類別,包含編碼、解碼與測試方法:
using System;
using System.Text.RegularExpressions;
public partial class StringHtmlEncoder : System.Web.UI.Page
{
///
/// 將字串轉為 HTML 十進制實體編碼 (碼位;)
///
/// 待編碼的字串
/// 編碼後的字串
public string EncodeToHtmlEntities(string input)
{
if (string.IsNullOrEmpty(input) || input.Trim() == "")
return "";
var result = new System.Text.StringBuilder();
foreach (char c in input)
{
result.Append("").Append(((int)c).ToString()).Append(";");
}
return result.ToString();
}
///
/// 正則匹配評估器:將 數字; 還原為字元
///
private string MatchEvaluator(Match m)
{
int codePoint = int.Parse(m.Groups[1].Value);
return ((char)codePoint).ToString();
}
///
/// 將 HTML 十進制實體編碼還原為原始字串
///
/// 已編碼的字串
/// 解碼後的原始字串
public string DecodeFromHtmlEntities(string encoded)
{
if (string.IsNullOrEmpty(encoded) || encoded.Trim() == "")
return "";
var regex = new Regex(@"(\d+);", RegexOptions.Compiled);
return regex.Replace(encoded, MatchEvaluator);
}
protected void Page_Load(object sender, EventArgs e)
{
string test = "ASP.NET 實體編碼測試";
string encoded = EncodeToHtmlEntities(test);
Response.Write("編碼結果:" + encoded + "
");
string decoded = DecodeFromHtmlEntities(encoded);
Response.Write("解碼結果:" + decoded);
}
}
前端同樣可實現雙向轉換,適合在客戶端處理編碼/解碼:
// 解碼:將 數字; 或 十六進制; 轉為字元
function decodeHtmlEntities(str) {
return str.replace(/(x)?([^&]{1,5});?/g, function (match, isHex, code) {
return String.fromCharCode(parseInt(code, isHex ? 16 : 10));
});
}
// 編碼:將字串轉為 十進制; 格式
function encodeToHtmlEntities(str) {
var codes = [];
for (var i = 0; i < str.length; i++) {
codes[i] = str.charCodeAt(i);
}
return "" + codes.join(";") + ";";
}
StringBuilder 而非字串串接。圖示範例:
