Delphi,charset detection([Uni] SynEdit) - Utf8Decode问题

时间:2009-09-25 15:16:20

标签: delphi unicode utf-8

我正在使用Unicode SynEdit,它(理论上)具有基本的文件/流编码检测功能。它工作正常,直到我尝试打开由我的PHP脚本生成的文件。我正在谈论的文件被UniSynEdit检测为utf8而没有BOM。不幸的是,它没有打开 - 加载的字符串是空的。我调试它,似乎问题是函数Utf8Decode,由于某种原因失败并返回空字符串。我也用十六进制编辑器检查了文件,这是真的:它没有BOM,所有普通字符都用一个字节编码,而我在文件中的一些抛光字母(如“ł”)是双字节的。 ..

可能出现什么问题,如何防止这种情况发生?我相信错误的编码加载比没有文件更好......

1 个答案:

答案 0 :(得分:3)

如果您确实要加载未正确UTF-8编码的文件,那么您需要使用一个函数,该函数不会为包含无效字节序列的字符串返回空结果,而是将它们替换为替换字符。请参阅Wikipedia entry on UTF-8,特别是“无效字节序列”部分。

不幸的是Delphi 2009(没有Delphi 7来检查)UTF8Decode()在内部调用MultibyteToWideChar(CP_UTF8, ...),这会在无效字节序列上返回错误。

您需要做的是使用替代编码功能。也许在第三方Delphi库中有一些东西有自己的解码功能。也许你可以使用其中一个链接库here。如果所有其他方法都失败了,您可以编写自己的,可能基于Unicode联盟的this code