Delphi 2009 全面遷移到 Unicode (UTF-16) 字符串模型,這帶來了跨平台、多語言支持的巨大優勢,但也引入了文本文件/流讀寫時的編碼轉換需求。為此,TStrings(及其派生類 TStringList、控件的 Lines/Items 屬性)和 TStream 系列(TFileStream、TMemoryStream 等)的核心存取方法均新增了接受 TEncoding 參數的重載版本。
| 類/組件 | 方法 | 新增重載簽名 |
|---|---|---|
| TStrings / TStringList | LoadFromFile | procedure LoadFromFile(const FileName: string; Encoding: TEncoding); |
| SaveToFile | procedure SaveToFile(const FileName: string; Encoding: TEncoding); | |
| LoadFromStream | procedure LoadFromStream(Stream: TStream; Encoding: TEncoding); | |
| SaveToStream | procedure SaveToStream(Stream: TStream; Encoding: TEncoding); | |
| TStream (TFileStream, TMemoryStream 等) | LoadFromFile | procedure LoadFromFile(const FileName: string; Encoding: TEncoding); (僅 TFileStream) |
| SaveToFile | procedure SaveToFile(const FileName: string; Encoding: TEncoding); (僅 TFileStream) | |
| LoadFromStream | procedure LoadFromStream(Stream: TStream; Encoding: TEncoding); | |
| SaveToStream | procedure SaveToStream(Stream: TStream; Encoding: TEncoding); |
TEncoding.ASCII:7 位 ASCII,非 ASCII 字符丟失。TEncoding.UTF8:UTF-8,無 BOM(默認),Web 標準編碼。TEncoding.Unicode:UTF-16 LE (Little Endian),Delphi 2009+ 內部默認編碼。TEncoding.BigEndianUnicode:UTF-16 BE。TEncoding.Default:系統當前 ANSI 代碼頁(如中文系統為 GB2312/GBK)。TEncoding.GetEncoding(codepage):獲取指定代碼頁編碼對象(如 936 for GBK, 65001 for UTF-8)。以下代碼演示了在按鈕點擊事件中,分別使用默認、ASCII、UTF-8 編碼對 TMemo 內容進行文件存取與流存取:
procedure TForm1.Button1Click(Sender: TObject); // TStrings 默認存取 (Unicode/ANSI 視版本而定)
var List: TStrings;
begin
List := TStringList.Create;
try
List.Text := str; // str 為包含中日韓文的測試字符串
List.SaveToFile(FilePath); // 無編碼參數,行為兼容舊版
List.LoadFromFile(FilePath);
Memo2.Lines := List;
finally List.Free; end;
end;
procedure TForm1.Button3Click(Sender: TObject); // TStrings UTF-8 存取
var List: TStrings;
begin
List := TStringList.Create;
try
List.Text := str;
List.SaveToFile(FilePath, TEncoding.UTF8); // 明確指定 UTF-8
List.LoadFromFile(FilePath, TEncoding.UTF8); // 讀取時必須匹配
Memo2.Lines := List;
finally List.Free; end;
end;
procedure TForm1.Button6Click(Sender: TObject); // TFileStream UTF-8 存取
var stream: TStream;
begin
stream := TFileStream.Create(FilePath, fmCreate);
try
Memo1.Lines.SaveToStream(stream, TEncoding.UTF8);
stream.Position := 0;
Memo2.Lines.LoadFromStream(stream, TEncoding.UTF8);
finally stream.Free; end;
end;
procedure TForm1.Button9Click(Sender: TObject); // TMemoryStream UTF-8 存取
var stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
Memo1.Lines.SaveToStream(stream, TEncoding.UTF8);
stream.SaveToFile(FilePath); // 保存流到文件
stream.LoadFromFile(FilePath);
stream.Position := 0;
Memo2.Lines.LoadFromStream(stream, TEncoding.UTF8);
finally stream.Free; end;
end;

TEncoding.UTF8 默認不寫入 BOM。若需帶 BOM,可用 TEncoding.UTF8.GetPreamble 手動寫入文件頭,或使用 TEncoding.GetEncoding(65001) (通常帶 BOM)。Encoding 參數的舊版重載在 Delphi 2009+ 中通常按 TEncoding.Default (ANSI) 處理,以兼容舊代碼,但新代碼強烈建議顯式指定編碼。TStream 的 SaveToStream/LoadFromStream 重載實際是將字符串按指定編碼轉為字節寫入流,或從流讀字節按編碼解碼為字符串。流對象本身不記錄編碼信息。Delphi 2009 通過為 TStrings 和 TStream 引入 TEncoding 參數,徹底解決了 Unicode 時代文本持久化的編碼困境。開發者應養成顯式指定編碼的習慣(推薦 UTF-8),確保數據在不同平台、不同語言環境下的完整性與可移植性。