Delphi 7中的utf8decode

5

我需要使用Delphi 7将字符串从UTF-8转换为WideString。有谁能告诉我为什么下面的代码在Delphi 7中无法工作?Utf8Decode函数的参数只是一个示例。

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

在Delphi 7中,它给了我很多问号,但在BDS2006中它运行良好。
我需要切换一些编译器指令吗?或者我如何将utf8String转换为Delphi 7中的Widestring?
解决方案:
Utf8Decode函数没有问题。Delphi代码提示工具提示表达式求值输出误导了我,因为它不能显示Widestrings。请参见下面的图像:
但是MessageBoxW可以显示文本,请参见下面的图像:

你首先想要做什么?你是如何显示WideString输出的?你真的需要UTF-8吗?WideString已经是Unicode了。在这里提供更多细节会很好。 - Jens Mühlenhoff
@JensMühlenhoff utf-8编码将来自一个xml文件,我想将其传递给另一个需要widestring的库函数。我使用调试器中的监视器来检查该值。 - balazs
我知道这并不总是一个选项,但为了支持Unicode,考虑升级到最新版本的Delphi是非常值得的,因为Unicode支持终于可以正常工作了。 - Toby Allen
1个回答

6
我相信问题在于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);

在此输入图像描述

试图以这种方式处理您的字符串文字是不切实际的。您可能需要开始将它们放入资源中。


1
我认为Delphi 7可以处理UTF-8编码的文件。该.pas文件是UTF-8编码而不带BOM(使用notepad++检查),并且在Delphi IDE中正确显示。我将您的MessageBoxW部分粘贴到我的Delphi 7代码中,它显示了正确的文本,看起来Code Insight无法显示widestring... - balazs
我并不是以这种方式存储utf-8字符串,我只是想举个快速的例子。最终结果是代码提示误导了我。utf8decode函数完美地工作了。谢谢。 - balazs
2
好的,但我仍然认为这是你所问问题的答案。 - David Heffernan
+1 "Trying to treat your string literals like this is simply not practical." 是正确的答案。 - kobik
@David,我会接受你的答案,因为使用MessageBoxW让我找到了正确的方向。但是我在示例中提供的文本已经是以Utf-8编码的文本被解释为Ansi,所以在你的示例中它被双重解释了。关于不将这些内容放入.pas文件的建议非常正确,我完全同意。你认为我应该将这个问题的标题改成其他内容,还是保持现在这样? - balazs
@balzas 是的,我从你的更新中可以看出我没有完全理解问题。我猜我们可能使用不同的ANSI代码页,这就是为什么我无法将你的ANSI转换到我的D6 ANSI编辑器中的原因。我使用的是Windows 1252,但我打赌你使用的是不同的ANSI代码页。我认为你应该将问题保留原样。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接