我发现(困难的方式)如果文件具有有效的 UTF-8 BOM 但包含任何无效的 UTF8 编码,并且由任何 Delphi (2009+) 启用编码的方法读取,例如LoadFromFile
,那么结果是完全空的文件,没有错误指示。在我的几个应用程序中,我宁愿简单地丢失一些错误的编码,即使在这种情况下我也没有收到错误报告。
调试显示MultiByteToWideChar
调用了两次,首先是获取输出缓冲区大小,然后是进行转换。但是 TEncoding.UTF8 包含FMBToWCharFlags
用于这些调用的私有值,并且这是用一个MB_ERR_INVALID_CHARS
值初始化的。所以获取字符数的调用返回 0 并且加载的文件是完全空的。在没有标志的情况下调用此 API 将“默默地丢弃非法代码点”。
我的问题是如何最好地编织编码区域中的类嵌套以解决这是一个私有值的事实(并且需要,因为它是所有线程的类 var)。我想我可以使用 Marco Cantu 的 Delphi 2009 书中的指导添加自定义 UTF8 编码。MultiByteToWideChar
如果在没有标志的情况下再次调用它之后返回编码错误,它可以选择性地引发异常。但这并不能解决如何使用我的自定义编码而不是Tencoding.UTF8
.
如果我可以在初始化时将其设置为应用程序的默认值,也许通过实际修改类 var for Tencoding.UFT8
,这可能就足够了。
当然,我需要一个解决方案,而无需等待提交 QC 报告,要求提供更强大的设计,让其接受并看到它发生变化。
任何想法都会非常受欢迎。有人可以确认这仍然是我尚未安装的 XE4 的问题吗?