【问题标题】:Delphi, charset detection ([Uni]SynEdit) - Utf8Decode problemDelphi, charset detection ([Uni]SynEdit) - Utf8Decode 问题
【发布时间】:2009-09-25 15:16:19
【问题描述】:

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

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

【问题讨论】:

  • 你用的是什么版本的Delphi?
  • 我忘了写... Delphi 7.
  • 有 BOM 时会发生什么?
  • 如果 UTF8Decode() 返回一个空字符串,那么输入的开头不是有效的 UTF-8。

标签: delphi unicode utf-8


【解决方案1】:

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

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

您需要做的是使用另一种编码功能。也许第三方 Delphi 库中有一些东西有自己的解码功能。也许您可以使用链接库之一here。如果一切都失败了,您可以自己编写,可能基于 Unicode 联盟的 this code

【讨论】:

  • 顺便说一句:如果你甚至没有意思你的 PHP 脚本来创建一个 UTF-8 文件 - 再想一想。它应该,最好是有效的 UTF-8 :-)
  • 这不是重点 :) 实际上,这要归功于我发现我的应用程序在某些时候失败了,到目前为止,我确信它可以处理所有 valid 文件。它确实如此。但是我没有机会再次测试那些无效的;)
  • 谢谢,看来使用 cUnicodeCodecs(Delphi 基础)中的 UTF8StringToWideString 效果很好:]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多