Delphi2010:编写代码来分配包含Unicode文字值的Caption或从文本文件中加载unicode符号?

Mic*_*ael 12 delphi unicode text project unicode-literals

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

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

怎么解决?

War*_* P 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还注意到,你的一条评论中你也遇到了包含unicode字符的源代码问题,这些字符未保存为UTF8文件...当我尝试将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;
Run Code Online (Sandbox Code Playgroud)

这里是同样人为的示例代码"修复"(更像是非故意破坏)所以它至少可以在delphi XE中工作:

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

上面指针的使用是设计的,也是不必要的,除了我试图用这个例子教导.

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

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

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

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

c := #$21CC; // U+21CC
Run Code Online (Sandbox Code Playgroud)

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


mjn*_*mjn 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中仍然是相同的)