| 代碼片段 | D2007 行為 | D2009+ 行為 | 遷移建議 |
SizeOf(Char) | 1 | 2 | 改用 SizeOf(AnsiChar) 或 SizeOf(WideChar) 明確意圖 |
Length(PChar) | 位元組數 | 字元數 | 改用 StrLen (Ansi) / WStrLen (Wide) |
PChar(str) | Ansi 緩衝區 | Unicode 緩衝區 | ANSI API 用 PAnsiChar(AnsiString(str)) |
'中文'[1] | 第 1 位元組 | 第 1 字元 '中' | 統一按字元索引,無需擔心雙位元組 |
Chr(20000) | 溢位/錯誤 | 正常返回 Unicode 字元 | 放心用 WideChar / Char |
API 呼叫類型選擇速查
// Windows API 結尾 A (ANSI) 版本
var
ansiStr: AnsiString;
begin
ansiStr := '中文';
MessageBoxA(0, PAnsiChar(ansiStr), 'Title', MB_OK);
end;
// Windows API 結尾 W (Unicode) 版本 (推薦 D2009+)
var
uniStr: string; // UnicodeString
begin
uniStr := '中文';
MessageBoxW(0, PWideChar(uniStr), 'Title', MB_OK);
// 或直接
MessageBox(0, PChar(uniStr), 'Title', MB_OK); // 映射到 MessageBoxW
end;
最佳實踐原則
- 業務邏輯統一用
string (UnicodeString) + Char — D2009+ 內建 Unicode 支援最完善
- 只在邊界處理 ANSI:檔案 I/O、舊 DLL、網路協議 — 用
AnsiString/AnsiChar/PAnsiChar
- 避免直接操作
PChar 算術 — 改用 string 索引或 TStringBuilder
- 字面值編碼:源碼儲存為 UTF-8 (D2009+ 預設),
'中文' 直接是 Unicode 字串
徹底掌握這六大類型的大小、範圍、指標語義與跨版本行為差異,是編寫健壯、可移植 Delphi 代碼的基石。
- 上一篇文章: Delphi String 內存結構揭秘:引用計數、長度前綴、#0 終結符與 Copy-on-Write 機制
- 下一篇文章: Delphi 字串類型全家族解析:string、AnsiString、WideString、ShortString、String[n]
Copyright ©
程式碼之家 All Rights Reserved