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

Delphi 2009 TStrings 與 TStream 編碼增強:全面支持 TEncoding 參數

     編輯:Delphi

背景:Unicode 時代的文本編碼挑戰

Delphi 2009 全面遷移到 Unicode (UTF-16) 字符串模型,這帶來了跨平台、多語言支持的巨大優勢,但也引入了文本文件/流讀寫時的編碼轉換需求。為此,TStrings(及其派生類 TStringList、控件的 Lines/Items 屬性)和 TStream 系列(TFileStream、TMemoryStream 等)的核心存取方法均新增了接受 TEncoding 參數的重載版本。

核心方法重載一覽

類/組件方法新增重載簽名
TStrings / TStringListLoadFromFileprocedure LoadFromFile(const FileName: string; Encoding: TEncoding);
SaveToFileprocedure SaveToFile(const FileName: string; Encoding: TEncoding);
LoadFromStreamprocedure LoadFromStream(Stream: TStream; Encoding: TEncoding);
SaveToStreamprocedure SaveToStream(Stream: TStream; Encoding: TEncoding);
TStream (TFileStream, TMemoryStream 等)LoadFromFileprocedure LoadFromFile(const FileName: string; Encoding: TEncoding); (僅 TFileStream)
SaveToFileprocedure SaveToFile(const FileName: string; Encoding: TEncoding); (僅 TFileStream)
LoadFromStreamprocedure LoadFromStream(Stream: TStream; Encoding: TEncoding);
SaveToStreamprocedure SaveToStream(Stream: TStream; Encoding: TEncoding);

常用編碼類型 (System.SysUtils.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;
編碼演示程序運行效果

關鍵注意事項

  1. 讀寫編碼必須一致:以 UTF-8 保存,必須以 UTF-8 讀取,否則會出現亂碼或解析錯誤。
  2. BOM (Byte Order Mark):TEncoding.UTF8 默認不寫入 BOM。若需帶 BOM,可用 TEncoding.UTF8.GetPreamble 手動寫入文件頭,或使用 TEncoding.GetEncoding(65001) (通常帶 BOM)。
  3. 默認行為變化:無 Encoding 參數的舊版重載在 Delphi 2009+ 中通常按 TEncoding.Default (ANSI) 處理,以兼容舊代碼,但新代碼強烈建議顯式指定編碼。
  4. TStream 本身不持有編碼:TStream 的 SaveToStream/LoadFromStream 重載實際是將字符串按指定編碼轉為字節寫入流,或從流讀字節按編碼解碼為字符串。流對象本身不記錄編碼信息。

總結

Delphi 2009 通過為 TStrings 和 TStream 引入 TEncoding 參數,徹底解決了 Unicode 時代文本持久化的編碼困境。開發者應養成顯式指定編碼的習慣(推薦 UTF-8),確保數據在不同平台、不同語言環境下的完整性與可移植性。

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