【问题标题】:utf8decode in delphi 7delphi 7中的utf8decode
【发布时间】:2012-02-07 13:36:07
【问题描述】:

我需要使用 delphi 7 将字符串从 utf8 转换为宽字符串。谁能告诉我为什么下面的代码在delphi 7中不起作用? Utf8Decode 函数的参数只是一个示例。

var ws: WideString;
begin
   ws := Utf8Decode('[أمبير] خطأ تيار- تيار Ů…ŘŞŮاصل مطلق');
end;

在delphi 7中它给了我很多问号,但是在bds2006中它运行良好。

我是否需要打开一些编译器指令,或者如何在 delphi 7 中将 utf8String 转换为 Widestring?

解决方案

Utf8Decode函数没什么问题,Delphi Code Insight Tooltip表达式求值输出误导了我,无法显示Widestrings。见下图:

但 MessageBoxW 可以显示文本:

【问题讨论】:

  • 你首先想做什么?你如何显示 WideString 输出?你真的需要 UTF-8,WideString 已经是 Unicode 了吗?很高兴在这里提供更多详细信息。
  • @JensMühlenhoff utf-8 来自一个 xml 文件,我想将它传递给另一个需要宽字符串的库函数。我使用调试器中的手表来检查值
  • 我知道这并不总是一种选择,但是对于 Unicode 支持,值得考虑升级到最新版本的 Delphi,因为 Unicode 支持终于可以正常工作了。

标签: delphi unicode delphi-7


【解决方案1】:

我认为问题在于 Delphi 7 只能将 ANSI 用于源文件。更高版本的 Delphi 将对源文件使用 UTF-8,实际上您可以指定希望对源文件使用的编码。

如果您将 UTF-8 编码的字符串解释为 ANSI(例如使用 Notepad++),那么您可以在 ANSI 源代码文件中嵌入 UTF-8 编码的文字。例如,此代码使用 Delphi 6 生成一个带有您的文本的消息框。

ws := UTF8Decode('[ŘÅمبير] خط؊تيار- تيار Ů…ŘŞŮاصل مطلق');
MessageBoxW(0, PWideChar(ws), 
  PWideChar(WideString(FloatToStr(CompilerVersion))), 0);

试图这样对待你的字符串字面量是不切实际的。您可能需要开始将它们放入资源中。

【讨论】:

  • 我认为 Delphi 7 可以处理 UTF-8 编码的文件。 .pas 文件是 Utf-8 编码,没有 BOM(使用 notepad++ 检查),并且在 Delphi IDE 中正确显示。我将您的 MessageBoxW 部分粘贴到我的 delphi 7 代码中,它显示了正确的文本,看起来代码洞察力无法显示宽字符串...
  • 我不以这种方式存储 utf-8 字符串,我只是想举个简单的例子.. 最后发现 Code 洞察误导了我。 utf8decode 功能完美运行。谢谢。
  • 好的,但我仍然认为这是您所提问题的答案。
  • +1 "试图像这样对待你的字符串文字根本不切实际。"是正确的答案。
  • @David 我会接受你的回答,因为使用 MessageBoxW 引导我走向正确的方向。但是我在示例中给出的文本已经是解释为 Ansi 的 Utf-8 编码文本,因此在您的示例中它是双重解释的。您关于不要将此类内容放入 .pas 的建议是非常正确的,我完全同意。你怎么看,我应该把这个问题的标题改成别的,还是这样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2012-12-21
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多