我發現(困難的方式),如果一個文件有一個有效的UTF-8 BOM但包含任何無效的UTF8編碼,並且被任何Delphi(2009+)編碼啓用的方法(如LoadFromFile
)讀取,那麼結果是一個完全空的文件,沒有錯誤指示。在我的幾個應用程序中,我寧願僅僅丟失一些不好的編碼,即使在這種情況下我也沒有收到錯誤報告。有沒有簡單的方法來解決Delphi utf8文件的缺陷?
調試顯示MultiByteToWideChar
被調用兩次,第一次獲取輸出緩衝區大小,然後進行轉換。但是TEncoding.UTF8包含這些調用的私有值FMBToWCharFlags
,並且這個值用MB_ERR_INVALID_CHARS
的值初始化。所以獲取charcount的調用返回0,並且加載的文件完全是空的。在沒有標誌的情況下調用這個API會'悄然丟棄非法代碼點'。
我的問題是如何最好地編織通過在編碼領域的類巢以解決這是一個私人價值(因爲它是所有線程類var)的事實。我想我可以使用Marco Cantu的Delphi 2009書中的指導來添加自定義的UTF8編碼。如果MultiByteToWideChar
在沒有該標誌的情況下再次調用之後返回編碼錯誤,它可以選擇性地引發異常。但是這並不能解決如何使用自定義編碼而不是Tencoding.UTF8
的問題。
如果我可以在初始化時將它設置爲應用程序的默認值,或許通過實際修改Tencoding.UFT8
的類var,這可能就足夠了。
當然,我需要一個解決方案,無需等待提交質量控制報告,詢問更強大的設計,接受並更改設計。
任何想法都會非常受歡迎。有人可以證實,這仍然是XE4的問題,我還沒有安裝?
如果您有答案,請將其作爲回答發佈,而不是作爲問題的編輯。否則,這個問題將永遠保持開放,沒有答案。 – Celada 2013-05-14 01:01:11