我使用英文Windows,"当前非Unicode程序语言"也是英文。静态控件看起来不错,但如果我尝试更改它们(Label.Caption:='unicode value'或Memo.LoadFromFile(textFilename)),文本会显示为:$^$&%*(#&#。
如何解决这个问题?
procedure Tform1.TestBad;
var
x:PAnsiChar;
s:String;
begin
x := 'test';
s := Copy(PChar(x),1,10);
Self.Caption := s;
end;
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
这些评论似乎与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相同)
如果您将项目从旧版Delphi迁移,请检查对话框中使用的字体。并非所有字体都支持所有Unicode字符。
我曾经遇到过一个问题,这个问题显然与您的类似:在调试器中,我的Unicode字符串是正确的,但在应用程序中,一些特殊字符显示为黑色方块。这是由于从Delphi 6迁移的旧程序中,某些标题是通过代码设置的。在新表单中,一切正常(这里的标题是在对话框编辑器中设置的,但实际上这并不重要)。
问题出在所有迁移表单的字体上。Delphi 6通常使用“MS Sans Serif”作为字体。但是,该字体缺少大多数Unicode字符。切换到“Tahoma”解决了我的问题。