早期 SuperObject 版本在處理中文(Unicode)時存在多種亂碼情況,作者 Henri Gourvest 已知悉。本文整理四種典型失效案例,供開發者繞過或等待修正版本。
procedure TForm1.Button1Click(Sender: TObject);
var jo: ISuperObject; stream: TStream;
begin
stream := TMemoryStream.Create;
jo := SO('{"Language":"簡體中文"}');
jo.SaveTo(stream, False, False); // False=不縮排、不轉義
stream.Position := 0;
Memo1.Lines.LoadFromStream(stream); // 顯示 {"Language":"€S-?}
stream.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
const FilePath = 'C:\Temp\Test.txt';
var jo: ISuperObject;
begin
jo := SO('{"Language":"簡體中文"}');
jo.SaveTo(FilePath, False, False);
with TStringList.Create do begin
LoadFromFile(FilePath);
ShowMessage(Text); // {"Language":"€S-?}
Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var jo: ISuperObject; stream: TStream;
begin
stream := TStringStream.Create('{"Language":"簡體中文"}'); // 預設 ANSI 編碼
jo := TSuperObject.ParseStream(stream);
ShowMessage(jo.AsJson(False, False)); // {"Language":"¼òÌåÖÐÎÄ"}
stream.Free;
end;
procedure TForm1.Button4Click(Sender: TObject);
const FilePath = 'C:\Temp\Test.txt';
var jo: ISuperObject;
begin
with TStringList.Create do begin
Add('{"Language":"簡體中文"}'); SaveToFile(FilePath); Free; // 預設 ANSI 儲存
end;
jo := TSuperObject.ParseFile(FilePath);
ShowMessage(jo.AsJson(False, False)); // 同案例三實體編碼
end;
TStringStream、TStringList.SaveToFile 預設使用系統 ANSI 頁碼頁,非 UTF-8。TStringStream.Create('...', TEncoding.UTF8) 明確指定 UTF-8。TStringList.SaveToFile(FilePath, TEncoding.UTF8) 儲存為 UTF-8 檔案。jo.AsJson(True, True) 並自行寫入 TFileStream + TEncoding.UTF8。內部統一以 UTF-16 (WideString/UnicodeString) 處理,I/O 邊界明確轉碼,避免隱性 ANSI/UTF-8 混用。