Delphi2010:如何编写代码来赋值包含Unicode字面量值的Caption或从文本文件加载Unicode符号?

12
如何在Delphi 2010中制作Unicode程序?
我使用英文Windows,"当前非Unicode程序语言"也是英文。静态控件看起来不错,但如果我尝试更改它们(Label.Caption:='unicode value'或Memo.LoadFromFile(textFilename)),文本会显示为:$^$&%*(#&#。
如何解决这个问题?

3
在 Delphi 2010 中,所有程序都是 Unicode 程序。如果你看到的是乱码,则说明问题比你描述的更复杂。你需要描述你所做的事情,发生了什么以及你预期发生的结果。请澄清一下。如果需要,请贴上代码或图片。 - Rob Kennedy
12
别着急,伙计们。这是一个新用户。他不应该因为这样的问题而被踩和关闭问题。相反,他需要编辑问题并提供更清晰明了的答案。 - Mason Wheeler
3
@梅森,这个问题应该被下投票。它是一个糟糕、无法回答的问题。如果迈克尔编辑后使其成为一个好问题,我将再次投票支持。我也会投票支持重新开放它,但前提是在成为一个不错的问题之后才这样做。 - Rob Kennedy
13
@Rob:我不同意你的观点。你在这里已经呆了好几年了,不能把新手的写作标准和你自己追求的质量相提并论,如果他们的帖子不符合标准就给予各种负面影响。这会导致社区氛围不友好,新人不愿意来参加。 - Mason Wheeler
8
StackOverflow需要一种对反对票进行投反对票的方式。拜托,这太“过度控制”了,而且不是一种好的方式。谢天谢地,在我学习Delphi时没有像你们这样“有用”的人围绕着我。 - Deltics
显示剩余7条评论
3个回答

19
让我假设一些事情,因为你没有给我太多的数据来参考。
1. 你以前用过Delphi,并且了解基本类型名称,比如String、Char等等。
2. 你可能不知道Delphi 2007(char=Ansichar/string=Ansistring)和Delphi 2009及以后版本(包括Delphi 2010和XE)之间的Unicode差异,其中Char=UnicodeChar,String=UnicodeString。
3. 如果你尝试直接操作字节大小的AnsiCharacter数据,并错误地强制转换为UnicodeString,那么你可能会看到垃圾值(在你的问题中表示为“the text looks like $^$&%*(#&#.”)。
4. MJN还注意到,根据你的评论,你在处理包含未保存为UTF8文件的Unicode字符的源代码时也遇到了问题...当我尝试将Unicode字符放入源文件中时,Delphi会自动询问我这个问题,我想你也会看到,并且正确回答(正确答案是是)...但你的问题中没有提到这一点,你真的应该尝试更新你的问题,以指明问题的来源。

enter image description here

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

enter image description here

你应该绝对发布生成错误字符串值的受影响代码。你应该从一些小的示例代码开始,而不是从一个你试图移植到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中文字符,而不是显示文本“测试”,因为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编码的文件来存储你以这种方式写的东西。

7

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

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

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


简短的答案:

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

(我猜Delphi 2010仍然采用默认不使用Unicode的方式,与Delphi 2009相同)


我擅自为OP编辑了问题,至少让问题的标题更加合理。 - Warren P

0

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

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

问题出在所有迁移表单的字体上。Delphi 6通常使用“MS Sans Serif”作为字体。但是,该字体缺少大多数Unicode字符。切换到“Tahoma”解决了我的问题。


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