【问题标题】:Delphi2010: Writing code to assign Caption containing Unicode literal values or load unicode symbols from text file?Delphi2010:编写代码以分配包含Unicode文字值的标题或从文本文件加载Unicode符号?
【发布时间】:2011-09-10 08:45:15
【问题描述】:

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

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

如何解决?

【问题讨论】:

  • -1。 Delphi 2010 中的所有程序都是 Unicode 程序。如果您遇到垃圾,那么您需要在此处描述更多问题。你需要描述你做了什么,发生了什么,以及你期望发生什么。请说清楚。贴一些代码。如果需要,请发布一些图片。
  • 简单,伙计们。这是一个新用户。对于这样的问题,他不需要被低估和近距离投票;他需要编辑问题并给出更明确的答案。
  • @Mason,这个问题应该被否决。这是一个糟糕的、无法回答的问题。如果迈克尔对其进行编辑以使其成为一个好问题,我将重新投票。我也会投票重新打开它,但同样,只有 这是一个不错的问题。
  • @Rob:我不同意。你已经在这附近好几年了。你不能让一个新手达到你在自己写作中所渴望的相同质量标准,如果他们的帖子达不到标准,你就不能对他们的帖子施加各种负面影响。这会造成一个新人不想加入的敌对社区。​​span>
  • StackOverflow 需要一种方法来否决投反对票。来吧伙计们,这将“重手”带到了一个新的水平,而且不是很好。感谢上帝,当我在德尔福找到自己的路时,我身边没有像你这样“乐于助人”的人。

标签: delphi text unicode project unicode-literals


【解决方案1】:

欢迎来到 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 还注意到,从您的一个 cmets 中,您也遇到了包含未保存为 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 编码的文件来存储您以这种方式编写的内容。

【讨论】:

    【解决方案2】:

    cmets

    为什么 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还是一样)

    【讨论】:

    • 我冒昧地为 OP 编辑​​了问题,至少使问题的标题更合理。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2012-11-21
      • 2020-08-01
      • 1970-01-01
      • 2012-04-04
      • 2015-01-22
      相关资源
      最近更新 更多