| 方法 | 參數類型 | 回傳類型 | 說明 |
ToUpper | Char | Char | 單一字元大寫 |
ToUpper | string | string | 字串全大寫 |
ToLower | Char | Char | 單一字元小寫 |
ToLower | string | string | 字串全小寫 |
完整測試程式碼
uses Character, Windows, SysUtils;
procedure TForm1.Button1Click(Sender: TObject); // Character.ToUpper
var c: Char; str: string;
begin
c := ToUpper('a'); // 'A'
str := ToUpper('Delphi'); // 'DELPHI'
ShowMessageFmt('%s, %s', [c, str]);
end;
procedure TForm1.Button2Click(Sender: TObject); // Character.ToLower
var c: Char; str: string;
begin
c := ToLower('A'); // 'a'
str := ToLower('Delphi'); // 'delphi'
ShowMessageFmt('%s, %s', [c, str]);
end;
procedure TForm1.Button3Click(Sender: TObject); // Windows API CharUpper/CharLower
var c1, c2: Char;
begin
c1 := Char(CharUpper(PChar('a'))); // 'A'
c2 := Char(CharLower(PChar('B'))); // 'b'
ShowMessageFmt('%s, %s', [c1, c2]);
end;
procedure TForm1.Button4Click(Sender: TObject); // SysUtils 舊版
var s1, s2: string;
begin
s1 := UpperCase('Delphi'); // 'DELPHI'
s2 := LowerCase('Delphi'); // 'delphi'
ShowMessageFmt('%s, %s', [s1, s2]);
end;
四種方案深度對比
| 方案 | 單元 | 支援類型 | Unicode 支援 | 效能 | 適用場景 |
Character.ToUpper/ToLower | Character | Char, string | ✅ 完整 (含語系特殊規則) | 高 | 現代 Delphi 專案首選 |
SysUtils.UpperCase/LowerCase | SysUtils | string | ⚠️ 部分語系有問題 (如土耳其語 İ/i) | 中 | 舊版相容、純 ASCII |
Windows.CharUpper/CharLower | Windows | PChar (單字元) | ✅ 系統區域設定相關 | 低 (API 呼叫開銷) | 需依賴系統區域設定 |
AnsiUpperCase/AnsiLowerCase | SysUtils | AnsiString | ❌ 僅 ANSI 代碼頁 | 中 | 舊版 ANSI 專案 |
Unicode 特殊大小寫規則實例
| 字元 | ToUpper | ToLower | 說明 |
| ß (德語銳音) | SS | ß | 大寫展開為兩字元 |
| İ (土耳其語帶點大寫 I) | İ | i (不帶點) | 語系相關對應 |
| ı (土耳其語不帶點小寫 i) | I (不帶點) | ı | 語系相關對應 |
| Σ (希臘語 Sigma) | Σ | σ/ς | 詞尾/非詞尾不同小寫 |
| Dž (塞爾維亞語 Dz) | DŽ | dž | 標題殼/大寫/小寫三形態 |
實務最佳實務
1. 統一使用 Character 單元
uses Character;
// 新專案統一採用
function NormalizeKey(const s: string): string;
begin
Result := Character.ToUpper(s); // 或 ToLower
end;
2. 大小寫不敏感比較
function SameTextEx(const s1, s2: string): Boolean;
begin
Result := Character.ToUpper(s1) = Character.ToUpper(s2);
// 或用 SysUtils.SameText (內部已處理區域設定)
end;
3. 首字大寫 (Title Case) 簡易實作
function ToTitleCase(const s: string): string;
var
words: TArray<string>;
i: Integer;
begin
words := s.Split([' ']);
for i := 0 to High(words) do
if words[i].Length > 0 then
words[i] := Character.ToUpper(words[i][1]) + Character.ToLower(words[i].Substring(1));
Result := string.Join(' ', words);
end;
避坑指南
- 勿混用 ANSI/Unicode 函數:
AnsiUpperCase 用於 AnsiString,Character.ToUpper 用於 string (UnicodeString)
- 土耳其語 I/ı 問題:跨平台/多語系專案務必用
Character 單元,避免 UpperCase('ı') = 'I' 導致邏輯錯誤
- 字元 vs 字串重載:
ToUpper('A') 回傳 Char,ToUpper('ABC') 回傳 string,編譯器自動解析
- 效能敏感場合:大量字元轉換考慮預先建立查找表或使用 SIMD 優化庫
總結
Character.ToUpper/ToLower 是 Delphi 2009+ 進行大小寫轉換的標準方案,完整支援 Unicode 複雜規則,API 設計直觀支援字元與字串雙重載。棄用舊版 UpperCase/LowerCase 及 Windows API,統一遷移至 Character 單元,即能構建健壯的國際化應用程式。
- 上一篇文章: Delphi 2009 Character 單元進階:字元分類函數 IsLetter/IsDigit/IsNumber 完整解析
- 下一篇文章: Delphi 2009 TCategoryPanelGroup 進階:HeaderStyle 樣式切換完全指南
Copyright ©
程式碼之家 All Rights Reserved