12

如何在 Delphi 2010 中制作 Unicode 程序?

我有英语 Windows,“非 Unicode 程序的当前语言”也是英语。静态控件看起来不错,但如果我尝试更改它们(Label.Caption := 'unicode value' 或 Memo.LoadFromFile(textFilename) ),文本看起来像:$^$&%*(#

如何解决?

4

3 回答 3

19

欢迎来到 StackOverflow。当您遇到此类问题时,请发布您的代码。我将解释问题的最可能来源,例如您所看到的问题,但是如果您不发布代码,我将无法帮助您解决它。此外,我必须做出很多假设,因为您要求我猜测您问题的几乎所有内容,这就是它被关闭的原因。我希望你以后能提供更多的细节,我们可以避免封闭的问题。

让我假设一堆事情,因为你没有给我很多数据继续下去。

  1. 您以前使用过 Delphi,并且了解基本类型名称,如 String、Char 等。

  2. 您可能不知道 Delphi 2007 (char=Ansichar/string=Ansistring) 和 Delphi 2009 或更高版本(包括 Delphi 2010 和 XE)之间的 Unicode 差异,其中 Char=UnicodeChar 和 String=UnicodeString。

  3. 您会看到垃圾(在您的问题中表示为 )的最常见原因the text looks like $^$&%*(#&#."是,如果您尝试直接操作字节大小的 AnsiCharacter 数据并以错误的方式将其强制转换为 UnicodeString。

  4. MJN 还注意到,从您的一条评论中,您也遇到了包含未保存为 UTF8 文件的 unicode 字符的源代码...当我尝试将 Unicode 字符放入源文件时,Delphi 自动问我这个问题,我假设您也看到并正确回答(正确答案是肯定的)...但是您的问题根本没有提到这一点,您确实应该尝试更新您的问题以指定问题的根源。

在此处输入图像描述

这是右键文件格式菜单,您可以随时更改编码,推荐值是UTF8,如下所示:

在此处输入图像描述

您绝对应该发布生成不正确字符串值的受影响代码。您应该从尝试移植到 Unicode Delphi 的大型应用程序开始(这是我在这里所做的第四个也是最大的假设),而是从一些小的示例代码开始。

这是一个“写得不好的代码”的例子,它恰好在 Delphi 7 中仍然有效,因为每个字符的大小都是一个字节,但是这个假设不会向上传播到 2009 年和 XE Delphi:

procedure Tform1.TestBad;
var
 x:PAnsiChar;
 s:String;
begin
  x := 'test';
  s := Copy(PChar(x),1,10);
  Self.Caption := s;
end;

这是相同的人为示例代码“固定”(更像是无意破坏),因此它至少可以在 delphi XE 中工作:

procedure Tform1.TestLessBad;
var
 x:PAnsiChar;
 s:String;
begin
  x := 'test';
  s := Copy(x,1,10);
  Self.Caption := s;
end;

上面的指针的使用是人为的,也是不必要的,除了我试图用这个例子来教学。

第一个示例将在表单的标题中创建 unicode 中文字符,而不是显示文本“test”,因为 2 个字节已成为单个字符,因为我故意做了一些不好的事情来向您展示一种简单的方法来生成您所说的这种噪音的,通过在我的代码中犯错误。

如果您在使用特定的 unicode 代码点时遇到问题,我建议您尝试这种表示法:

c := Char($21CC);  // this is U+21CC (cool two arrows thingy used in chemistry to indicate a reversible reaction)

或者你会看到这个,这几乎是一样的:

c := #$21CC; // U+21CC

请注意,您不需要 UTF8 编码的文件来存储您以这种方式编写的内容。

于 2011-06-08T05:03:45.983 回答
7

评论

为什么 Unicode Delphi 不保存在 UTF-8 中?

Delphi 2010 已将项目保存在 UTF-8 中,我已转换为 UTF-8 并开始工作

似乎与 Delphi 项目(dpr 和/或 pas)源代码文件的编码有关。例如,如果将它们设置为 ANSI,则可能会错误地保存不属于当前代码页的字符。

IDE(至少在 Delphi 2009 中)创建文件格式设置为ANSI的新单元。对于混合语言源代码,必须使用文本编辑器中的上下文菜单(文件格式 | UTF8)手动激活 UTF-8(或 UCS 风格之一)。

IDE(在 Delphi 2009 中)似乎也没有将默认文本格式设置为 ANSI 以外的其他格式的选项。(请参阅如何将 Delphi IDE 中的默认文件格式设置为 UTF8?


简短的回答:

将源代码的文件格式设置为 UTF-8。

(Delphi 2009 IDE默认不使用Unicode,我猜这在Delphi 2010还是一样)

于 2011-06-08T05:17:51.830 回答
0

如果您从旧的 Delphi 版本迁移项目,请检查对话框中使用的字体。并非所有字体都支持所有 Unicode 字符。

我遇到了一个问题,这显然与您的问题相似:我在调试器中有正确的 unicode 字符串,但在应用程序中,一些特殊字符显示为黑色方块。这是从 Delphi 6 迁移的旧程序,其中一些标题是通过代码设置的。在新表单上一切正常(这里的标题是在对话框编辑器中设置的,但这实际上并不相关)。

问题是所有迁移表单的字体。Delphi 6 曾经使用“MS Sans Serif”作为字体。但是这种字体缺少大多数 unicode 字符。切换到“Tahoma”解决了我的问题。

于 2013-09-17T10:09:59.343 回答