首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 2009 字符串與字符類型變革:UnicodeString 與 WideChar 完全解析

     編輯:Delphi

核心變更:默認類型轉向 Unicode

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;
字符類型演示程序界面

遷移指南與最佳實踐

  1. 慎用 Length 計算緩衝區大小:Length(s) * SizeOf(Char) 才是字節長度。
  2. 文件/網絡/外部 API 交互:明確使用 TEncoding 或 AnsiString/UTF8String,勿假設 string 即字節流。
  3. 逐字符處理:優先使用 for c in s 或 for i := 1 to Length(s),避免按字節偏移訪問 PChar(s)[i]。
  4. API 聲明:調用 Windows API 時,字符串參數建議用 PWideChar (對應 LPCWSTR) 配合 Unicode 版 API (以 W 結尾),或用 PAnsiChar 配合 ANSI 版 API (以 A 結尾)。
  5. 字符串字面量:源代碼默認按 UTF-8 保存,編譯器自動將字面量轉為 UnicodeString。

總結

Delphi 2009 的 Unicode 遷移雖帶來短期適應成本,但從根本上解決了多語言支持難題,使 Delphi 應用能原生處理全球字符集。理解 string/Char 與 AnsiString/AnsiChar 的邊界與轉換規則,是編寫健壯現代 Delphi 代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved