我有英文Windows和“非Unicode程序的当前语言”也是英文.静态控件看起来不错,但是如果我尝试更改它们(Label.Caption:=’unicode value’或Memo.LoadFromFile(textFilename)),则文本看起来像:$^ $&%*(#&#.
如何解决?
非常感谢!
解决方法
让我假设一堆事情,因为你没有给我很多数据继续下去.
>你以前使用过Delphi,你知道String,Char等基本类型名称.
>您可能不知道Delphi 2007(char = Ansichar / string = Ansistring)和Delphi 2009-or-later(包括Delphi 2010和XE)之间的Unicode差异,其中Char = UnicodeChar和String = UnicodeString.
>最常见的原因,您会看到垃圾(在您的问题中表示为文本看起来像$^ $&%*(#&#.“)是如果您尝试直接操作字节大小的AnsiCharacter数据并强制它以错误的方式进入UnicodeString.
> 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,10); Self.Caption := s; end;
使用上面的指针是有创造力的,不必要的,除了我试图用这个例子教导.
第一个例子将在表单的标题中创建unicode汉字,而不是显示文本’test’,因为2个字节已经变成单个字符,因为我有意地做了一些BAD来显示一个简单的方式来产生你所说的噪音的,通过在我的代码中犯错误.
如果您遇到特定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编码的文件来存储你这样写的东西.