我家產品自從 D7 升級成 XE 後,在開發時,報表從零到有還蠻輕鬆的,FR (FastReport) 的報表產生器所產出的 fr3 報表定義檔會自動存為 UTF8 格式。上線後,才發現之前存在 D7 裡的 fr3 在 XE 中在中文的地方會出現亂碼。
D7 所設計的 fr3
XE 讀取 D7 設計的 fr3
沒有什麼比轉一半更令人揪心
在遇到問題時,如果這問題有一致性,就像文字轉碼一樣,全是亂碼的還容易處理:找到編碼,轉換,收工。
但現在的情況是 FR 轉出的 fr3 檔,有部分正常,有部分亂碼,這關最難解!
災難中的小確幸,確定是編碼問題
D7 只支援 Ansi,所以轉出來的 fr3 無庸至疑的是 Ansi,從圖片可知是採繁體中文大 5 碼 (Big5) 代碼頁 (CodePage=950)。
既然知道是 Ansi,現在就可以來猜亂碼的地方是什麼編碼。
我還是直接公佈答案好了:
沒錯,就是 Ansi 的 UTF8 代碼頁 (CodePage=65001)!
難解之處就在二選一
從上圖可以知道當切換代碼頁時,原本能顯示中文的地方會變成亂碼,反之亦然。哼哼,FastReport 真有你的,硬是不出升級工具。官方沒準備,只好自己硬上。
fr3 是 XML 格式,但
Delphi 的 XML Mapper 是很實用的 XML 解析工具,但無奈 fr3 是一個特規,它無法順利解析 fr3 的內容。
先說結論
經過在漫長的奮鬥之路後,總算是做出一個像樣的結果:
該顯示中文的地方能順利顯示中文,格式也採 UTF8,尤其是 XE 開始支援 Unicode 後,Ansi 文字處理變得相對麻煩,【System.AnsiStrings 單元】會是過這關的最佳利器!
和你分享 ❤
See also
- How can I convert TBytes to RawByteString?
- Delphi XE - RawByteString vs AnsiString
- System.AnsiStrings - RAD Studio API Documentation
- Delphi Tokyo - Function: String to Hex and Hex to String
沒有留言:
張貼留言