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

Delphi 字元類型完整對比:Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideChar

     編輯:Delphi

Delphi 字元與字元指標類型體系全景圖

Delphi 歷經 Ansi (D2007 前) 到 Unicode (D2009+) 兩大時代,字元類型體系發生根本變化。本文系統對比 Char/AnsiChar/WideChar 及其指標類型的大小、範圍、賦值規則、互轉方式,助你跨版本無縫開發。

單字元類型對比

AnsiChar (Char) 賦值與操作範例


var
  c: Char;
begin
  // 十進制、十六進制字面值
  c := #65;      // 'A'
  c := #$41;     // 'A'

  // Chr 函數
  c := Chr(65);  // 'A'
  c := Chr($41); // 'A'

  // 長度與大小
  Length(c);     // 1 (字元數)
  SizeOf(c);     // 1 (D2007) / 2 (D2009+)

  // 直接接受單字元字串字面值
  c := 'B';      // 隱式轉換
end;

WideChar 賦值與操作範例


var
  c: WideChar;
begin
  // 兼容 AnsiChar 範圍
  c := #65;          // 'A' (佔 2 Bytes)
  SizeOf(c);         // 2
  Length(c);         // 1

  // 直接用 Unicode 碼位
  c := #$4E07;       // '萬'
  c := #19975;       // '萬'
  c := WideChar($4E07); // '萬'

  // 注意:無法直接用 '萬' 字面值 (D2007)
  // c := '萬';  // 錯誤
  // 變通:
  c := WideString('萬')[1];  // '萬'

  // 組合顯示
  ShowMessage(#19975#19968);  // '萬一'
  ShowMessage(#$4E07#$4E00);  // '萬一'
end;

字元指標類型對比

類型D2007 前D2009+大小範圍典型用途
CharAnsiCharWideChar1/2 Bytes#0..#255 / #0..#65535通用字元
AnsiCharAnsiCharAnsiChar1 Byte#0..#255ANSI/多位元組字元
WideCharWideCharWideChar2 Bytes#0..#65535Unicode 字元 (UTF-16)

PChar / PAnsiChar 使用範例


var
  p: PChar;
  str: string;
begin
  // 直接賦字面值
  p := '萬一';
  Length(p);  // 4 (D2007: 位元組數 / D2009+: 字元數)

  // 變數賦值需轉換
  str := '萬一的 Delphi 博客';
  p := PChar(str);  // 取內部緩衝區指標
  Length(p);        // 18
end;

PWideChar 使用範例


var
  p: PWideChar;
  ws: WideString;  // 注意:必須用 WideString,非 string (D2007)
begin
  p := '萬一';
  Length(p);  // 2

  ws := '萬一的 Delphi 博客';
  p := PWideChar(ws);
  Length(p);  // 13
end;

跨版本遷移關鍵差異表

類型D2007 前D2009+指向目標長度語義
PCharPAnsiCharPWideChar#0 結尾字串字元數 (到 #0)
PAnsiCharPAnsiCharPAnsiChar#0 結尾 Ansi 字串位元組數/字元數
PWideCharPWideCharPWideChar#0 結尾 Unicode 字串字元數 (到 #0)

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;

最佳實踐原則

  1. 業務邏輯統一用 string (UnicodeString) + Char — D2009+ 內建 Unicode 支援最完善
  2. 只在邊界處理 ANSI:檔案 I/O、舊 DLL、網路協議 — 用 AnsiString/AnsiChar/PAnsiChar
  3. 避免直接操作 PChar 算術 — 改用 string 索引或 TStringBuilder
  4. 字面值編碼:源碼儲存為 UTF-8 (D2009+ 預設),'中文' 直接是 Unicode 字串

徹底掌握這六大類型的大小、範圍、指標語義與跨版本行為差異,是編寫健壯、可移植 Delphi 代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
代碼片段D2007 行為D2009+ 行為遷移建議
SizeOf(Char)12改用 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