在實際開發中,為了滿足傳輸、儲存或顯示等特殊需求,字元資料常需依據特定規則進行轉碼。本文將系統整理 C# 中常見的字元轉碼場景,包含字串編碼轉換、HTML 編碼、URL 編碼、Base64 編碼以及位元組陣列與字串的互轉,並提供可直接參考的程式碼範例。
根據來源編碼與目標編碼進行轉換,但需注意編碼不匹配可能導致亂碼。以下方法示範如何在不同編碼間轉換字串:
/// <summary>
/// 字串編碼轉換
/// </summary>
/// <param name="srcEncoding">原編碼</param>
/// <param name="dstEncoding">目標編碼</param>
/// <param name="srcStr">原字串</param>
/// <returns>轉換後字串</returns>
public static string TransferEncoding(Encoding srcEncoding, Encoding dstEncoding, string srcStr) {
byte[] srcBytes = srcEncoding.GetBytes(srcStr);
byte[] bytes = Encoding.Convert(srcEncoding, dstEncoding, srcBytes);
return dstEncoding.GetString(bytes);
}
測試範例:
input = "歡迎來到轉碼世界!";
result = Transfer.TransferEncoding(Encoding.Default, Encoding.UTF8, input);
// 結果:歡迎來到轉碼世 界!
Console.WriteLine("TransferEncoding 結果:{0}", result);
result = Transfer.TransferEncoding(Encoding.UTF8, Encoding.Default, result);
Console.WriteLine("TransferEncoding 反轉碼結果:{0}", result);
// 結果:歡迎來到轉碼世界 !
HTML 編碼將 `<`、`>` 等特殊字元轉換為實體(`<`、`>`),防止在 HTTP 傳輸或頁面嵌入時被誤解析。.NET 提供 `HttpUtility.HtmlEncode/HtmlDecode` 或 `WebUtility` 類別處理。
/// <summary> HTML 編碼 </summary>
public static string HtmlEncode(string html) {
return HttpUtility.HtmlEncode(html); // 或 System.Net.WebUtility.HtmlEncode(html);
}
/// <summary> HTML 解碼 </summary>
public static string HtmlDecode(string html) {
return HttpUtility.HtmlDecode(html); // 或 System.Net.WebUtility.HtmlDecode(html);
}
測試範例:
input = "<head>you & me</head>"; result = Transfer.HtmlEncode(input); // 結果: <head>you & me</head> result = Transfer.HtmlDecode(result); // 結果: <head>you & me</head>
URL 編碼對特殊字元進行義(如 `<` 變 `%3c`),確保 URL 合法傳輸。預設使用 UTF-8 編碼。
/// <summary> URL 編碼 </summary>
public static string UrlEncode(string url) {
return HttpUtility.UrlEncode(url);
}
/// <summary> URL 解碼 </summary>
public static string UrlDecode(string url) {
return HttpUtility.UrlDecode(url);
}
測試範例:
input = "https://www.baidu.com?username=<find>&content=ab c"; result = Transfer.UrlEncode(input); // 結果:http%3a%2f%2fwww.baidu.com%3fusername%3d%3cfind%3e%26content%3dab+c result = Transfer.UrlDecode(result); // 結果:https://www.baidu.com?username=<find>&content=ab c
Base64 使用 64 個 ASCII 字元將任意位元組序列重新編碼,常用於 HTTP 環境下的長識別碼傳遞或簡易資料遮蔽。
編碼原理: 以 3 位元組為一組(24 位),拆成 4 組各 6 位,高位補 0 成 8 位,再對應 Base64 字元表。不足 3 位元組時以 `=` 填充。
/// <summary> Base64 編碼 </summary>
public static string ToBase64(string input) {
byte[] bytes = Encoding.UTF8.GetBytes(input);
return Convert.ToBase64String(bytes);
}
/// <summary> Base64 解碼 </summary>
public static string FromBase64(string input) {
byte[] bytes = Convert.FromBase64String(input);
return Encoding.UTF8.GetString(bytes); // 原文有誤,此處修正為正確解碼
}
測試範例:
input = "Coming from the new world!"; result = Transfer.ToBase64(input); // 結果:Q29taW5nIGZyb20gdGhlIG5ldyB3b3JsZCE= result = Transfer.FromBase64(result); // 結果:Coming from the new world!
`BitConverter` 類別提供基礎型別與位元組陣列的轉換。常見用法為將位元組陣列轉為以 `-` 分隔的十六進位字串,反之亦然。
/// <summary> 位元組陣列轉十六進位字串 </summary>
public static string BitToString(byte[] bytes) {
if (bytes == null) return null;
return BitConverter.ToString(bytes); // 例:43-6F-6D-69...
}
/// <summary> 十六進位字串轉位元組陣列 </summary>
public static byte[] FromBitString(string bitStr) {
if (bitStr == null) return null;
string[] sInput = bitStr.Split('-');
byte[] data = new byte[sInput.Length];
for (int i = 0; i < sInput.Length; i++) {
data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
}
return data;
}
測試範例:
input = "Coming from the new world!"; result = Transfer.BitToString(Encoding.UTF8.GetBytes(input)); // 結果:43-6F-6D-69-6E-67-20-66-72-6F-6D-20-74-68-65-20-6E-65-77-20-77-6F-72-6C-64-21 result = Encoding.UTF8.GetString(Transfer.FromBitString(result)); // 結果:Coming from the new world!
