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

时间:2011-06-07 19:30:53

标签: delphi text unicode project unicode-literals

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

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

如何解决?

3 个答案:

答案 0 :(得分: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自动问我这个问题,我假设你也看到了,并正确回答(正确的答案是肯定的)......但是你的问题根本没有提到这一点,你真的应该尝试更新你的问题以指定来源你的问题。

  5. 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中文字符,而不是显示文本'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编码的文件来存储您以这种方式编写的内容。

答案 1 :(得分: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以外的其他格式。 (见How can I set the default file format in the Delphi IDE to UTF8?


答案简短:

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

(Delphi 2009 IDE默认不使用Unicode,我猜这在Delphi 2010中仍然是相同的)

答案 2 :(得分:0)

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

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

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