編碼與位元組陣列互轉
取得字元編碼值
using System.Text;
// 預設編碼 (ANSI/DBCS,中文環境為 CP950)
byte[] bytes = Encoding.Default.GetBytes("啊"); // 長度 2
int b1 = bytes[0]; // 162 (0xA2)
int b2 = bytes[1]; // 177 (0xB1)
// Unicode (UTF-16LE)
bytes = Encoding.Unicode.GetBytes("啊"); // 長度 2
// bytes[0]=0x55, bytes[1]=0x4A (小端序)
位元組陣列還原字串
// 從 Unicode 位元組還原
bytes = new byte[] { 0x55, 0x4A }; // "啊" 的 UTF-16LE
string s = Encoding.Unicode.GetString(bytes); // "啊"
// 從預設編碼位元組還原
bytes = new byte[] { 0xA2, 0xB1 };
s = Encoding.Default.GetString(bytes); // "啊"
字串長度計算
string s = "iam方槍槍";
int charCount = s.Length; // 6 (Char 數)
int byteCount = Encoding.Default.GetByteCount(s); // 9 (3 ASCII + 3*2 DBCS)
int byteCountUtf8 = Encoding.UTF8.GetByteCount(s); // 12 (3 ASCII + 3*3 UTF-8)
高效拼接:StringBuilder
var sb = new StringBuilder();
sb.Append("i ");
sb.Append("am ");
sb.Append("方槍槍");
string result = sb.ToString(); // "iam方槍槍"
// 進階:預估容量避免擴展
var sb2 = new StringBuilder(100);
for (int i = 0; i < 1000; i++) sb2.Append(i).Append(',');
常用編碼類別速查
| 屬性/方法 | 說明 |
Encoding.Default | 系統預設 ANSI 編碼 (中文為 CP950/Big5) |
Encoding.UTF8 | UTF-8 (BOM 可用 new UTF8Encoding(true)) |
Encoding.Unicode | UTF-16LE (小端序) |
Encoding.BigEndianUnicode | UTF-16BE |
Encoding.GetEncoding("gb2312") | 簡體中文常用編碼 |
Encoding.GetBytes(str) | 字串 → 位元組陣列 |
Encoding.GetString(bytes) | 位元組陣列 → 字串 |
Encoding.GetByteCount(str) | 取得位元組長度 (不配置陣列) |
實用小技巧
移除 BOM
var utf8NoBom = new UTF8Encoding(false);
byte[] bytes = utf8NoBom.GetBytes("Hello");
偵測編碼
// 簡易偵測:嘗試以 UTF-8 解碼,失敗則回退 Default
public string DetectAndDecode(byte[] data)
{
try { return Encoding.UTF8.GetString(data); }
catch { return Encoding.Default.GetString(data); }
}
Base64 編碼/解碼
string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes("Hello"));
string original = Encoding.UTF8.GetString(Convert.FromBase64String(base64));