Delphi 字元類型與編碼值互轉完整指南
Delphi 提供 Char/AnsiChar (1 位元組) 與 WideChar (2 位元組) 兩大字元類型,掌握它們與數值編碼 (Ordinal/Unicode) 的雙向轉換,是處理文字、解析協議、呼叫 API 的基礎技能。
AnsiChar (Char) 與編碼互轉
var
b: Byte;
c: Char;
begin
// 字元 → 編碼值 (多種等價寫法)
b := Ord('A'); // 65
b := Ord(#65); // 65
b := Ord($41); // 65
b := Byte('A'); // 65 (直接類型轉換)
b := Byte(#$41); // 65
// 編碼值 → 字元
c := Chr(65); // 'A'
c := Chr($41); // 'A'
c := Char(65); // 'A'
c := Char($41); // 'A'
end;
WideChar 與 Unicode 編碼互轉
var
w: Word;
c: WideChar;
ws: WideString;
s: string;
begin
// 準備:取得漢字 '萬' 的 WideChar
ws := '萬一';
c := ws[1]; // '萬'
// 漢字 → Unicode 編碼
w := Ord(c); // 19975 (十進制)
w := Word(c); // 19975
s := Format('%.4x', [Ord(c)]); // '4E07' (十六進制字串)
s := IntToHex(Ord(c), 4); // '4E07'
// Unicode 編碼 → 漢字 (多種寫法)
c := #19975; // '萬'
c := #$4E07; // '萬'
c := #$4e07; // '萬' (不分大小寫)
c := WideChar(19975); // '萬'
c := WideChar($4E07); // '萬'
// 組合顯示
ShowMessage(#19975#19968); // '萬一'
ShowMessage(#$4e07#$4e00); // '萬一'
end;
類型大小與範圍對照
| 類型 | 大小 | 範圍 | 別名 |
| Char / AnsiChar | 1 Byte | #0..#255 ($00..$FF) | Ansi 字元 |
| WideChar | 2 Bytes | #0..#65535 ($0000..$FFFF) | UTF-16 代碼單元 |
常見陷阱與最佳實踐
1. 字面值直接賦值 WideChar
// 錯誤:'萬' 是 AnsiString 字面值,無法直接賦給 WideChar
// c := '萬'; // 編譯錯誤
// 正確:透過 WideString 中介
c := WideString('萬')[1]; // '萬'
2. 跨平台 Unicode 處理 (Delphi 2009+)
// 統一使用 string (UnicodeString) 與 Char (WideChar)
var
s: string; // UnicodeString
c: Char; // WideChar
begin
s := '萬一';
c := s[1]; // 直接可用,無需轉換
// Ord(c) 直接得 Unicode 碼位
end;
3. API 呼叫時的字元類型選擇
| API 類型 | 對應 Delphi 類型 | 轉換方式 |
| ANSI API (結尾 A) | PAnsiChar / AnsiString | PAnsiChar(AnsiStr) |
| Unicode API (結尾 W) | PWideChar / string | PWideChar(Str) |
實用工具函數
// 取得字元 Unicode 碼位 (十六進制 4 位)
function CharToHex4(const C: WideChar): string;
begin
Result := IntToHex(Ord(C), 4);
end;
// 從 Unicode 碼位建立字元
function Hex4ToChar(const Hex4: string): WideChar;
begin
Result := WideChar(StrToInt('$' + Hex4));
end;
// 批次轉換字串為 Unicode 碼位陣列
function StringToCodePoints(const S: string): TArray<Integer>;
var
i: Integer;
begin
SetLength(Result, Length(S));
for i := 1 to Length(S) do
Result[i-1] := Ord(S[i]);
end;
熟練掌握 Ord/Chr/Byte/Word/WideChar 互轉,配合 IntToHex/Format 格式化,能輕鬆應對字元編碼診斷、協議解析、舊碼遷移等場景。
- 上一篇文章: Delphi BDE 直連 Oracle 日期空值導致查詢錯誤的解決方案
- 下一篇文章: Delphi 字串與 Windows API 互操作:PChar、緩衝區、記憶體管理完整指南
Copyright ©
程式碼之家 All Rights Reserved