我发现(困难的方式),如果一个文件有一个有效的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