Delphi 2009 是語言發展史上的里程碑版本,最關鍵的變更在於默認字符串類型與字符類型雙雙轉為 Unicode:
string 現在映射為 UnicodeString (UTF-16 LE)Char 現在映射為 WideChar (16 位)PString = PUnicodeString,PChar = PWideChar這意味著「字符」不再等同於「字節」。Length(s) 返回字符數(代碼單元數),而非字節數;SizeOf(Char) = 2 字節。
為兼容舊代碼及特定場景(如文件格式、網絡協議、DLL 交互),Delphi 保留了顯式的 ANSI 類型:
AnsiString:單字節字符串,代碼頁由編碼指定。AnsiChar:單字節字符。WideString:COM/BSTR 兼容的 Unicode 字符串(引用計數、非 Copy-on-Write)。以下表單代碼遍歷輸入框文本,分別以 string、AnsiString、WideString、Char、AnsiChar、WideChar 類型迭代,輸出每個「字符」內容,直觀展示長度與內容差異:
procedure TForm1.Button1Click(Sender: TObject); // string (UnicodeString)
var str: string; i: Integer;
begin
str := Edit1.Text;
Memo1.Clear;
for i := 1 to Length(str) do Memo1.Lines.Add(str[i]); // 逐字符 (UTF-16 碼元)
end;
procedure TForm1.Button2Click(Sender: TObject); // AnsiString
var str: AnsiString; i: Integer;
begin
str := Edit1.Text; // 隱式 Unicode -> ANSI 轉換 (按 Default 代碼頁)
Memo1.Clear;
for i := 1 to Length(str) do Memo1.Lines.Add(str[i]); // 逐字節
end;
procedure TForm1.Button3Click(Sender: TObject); // WideString
var str: WideString; i: Integer;
begin
str := Edit1.Text;
Memo1.Clear;
for i := 1 to Length(str) do Memo1.Lines.Add(str[i]); // 逐字符 (同 UnicodeString)
end;
procedure TForm1.Button4Click(Sender: TObject); // Char (WideChar)
var c: Char;
begin
Memo1.Clear;
for c in Edit1.Text do Memo1.Lines.Add(c); // for-in 遍歷 Unicode 字符
end;
procedure TForm1.Button5Click(Sender: TObject); // AnsiChar
var c: AnsiChar;
begin
Memo1.Clear;
for c in AnsiString(Edit1.Text) do Memo1.Lines.Add(c); // 先轉 ANSI 再遍歷字節
end;
procedure TForm1.Button6Click(Sender: TObject); // WideChar
var c: WideChar;
begin
Memo1.Clear;
for c in Edit1.Text do Memo1.Lines.Add(c); // 同 Char
end;

Length 計算緩衝區大小:Length(s) * SizeOf(Char) 才是字節長度。TEncoding 或 AnsiString/UTF8String,勿假設 string 即字節流。for c in s 或 for i := 1 to Length(s),避免按字節偏移訪問 PChar(s)[i]。PWideChar (對應 LPCWSTR) 配合 Unicode 版 API (以 W 結尾),或用 PAnsiChar 配合 ANSI 版 API (以 A 結尾)。UnicodeString。Delphi 2009 的 Unicode 遷移雖帶來短期適應成本,但從根本上解決了多語言支持難題,使 Delphi 應用能原生處理全球字符集。理解 string/Char 與 AnsiString/AnsiChar 的邊界與轉換規則,是編寫健壯現代 Delphi 代碼的基石。