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

SuperObject 中文亂碼問題分析與回報:SaveTo、ParseStream、ParseFile 實測

     編輯:Delphi

早期 SuperObject 版本在處理中文(Unicode)時存在多種亂碼情況,作者 Henri Gourvest 已知悉。本文整理四種典型失效案例,供開發者繞過或等待修正版本。

案例一:SaveTo Stream 產生亂碼

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;

案例二:SaveTo File 同樣亂碼

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;

案例三:ParseStream 解析 UTF-8 字串流產生實體編碼

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;

案例四:ParseFile 讀取 UTF-8 檔案同樣實體化

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。
  • 規避方案:
    1. 使用 TStringStream.Create('...', TEncoding.UTF8) 明確指定 UTF-8。
    2. TStringList.SaveToFile(FilePath, TEncoding.UTF8) 儲存為 UTF-8 檔案。
    3. 若需輸出 UTF-8 JSON,改用 jo.AsJson(True, True) 並自行寫入 TFileStream + TEncoding.UTF8。
  • 長期解決:更新至 GitHub 最新 SuperObject 版本,已修正大多數 Unicode 處理問題。

給庫作者的建議

內部統一以 UTF-16 (WideString/UnicodeString) 處理,I/O 邊界明確轉碼,避免隱性 ANSI/UTF-8 混用。

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