如何知道(在代码中)某些字符在Delphi中创建的程序的界面中显示正常(或不显示)

时间:2011-04-09 08:18:43

标签: delphi interface

对不起我的英文......

我正在尝试在Delphi 7中创建一个小程序。 它的界面将包含我的语言文本,其中包含一些带有变音符号的字符。 如果将“非Unicode程序的语言”设置为我的语言,则这些字符始终显示正常。这很正常。 如果被设置为其他东西,有时显示正常,有时它们不是。 我怎么知道它们可以显示得很好......? 哦,我不能使用Unicode组件,只是正常。

我发现的唯一方法是将一个字符的图像捕获到位图中并逐个像素地检查。但实施起来需要做很多工作,缓慢而且不精确。

我可以使用GetSystemDefaultLangID函数并知道“非Unicode程序的语言”设置为其他内容,但仍然不知道它们是否显示正常。

谢谢你的任何想法。

4 个答案:

答案 0 :(得分:2)

欢迎使用代码页编码的AnsiStrings的乐趣。您根本不应该使用AnsiStrings,而且您知道,但是您没有解释它就不能使用unicode控件。这对我来说很奇怪。你应该使用:

(a)Unicode版本的Delphi(2009,2010,XE),其中String = UnicodeString。

(b)如果不是这样,至少使用适当的Unicode控件,如TNT控件,并在内部使用WideString类型,你需要存储重音或国际字符。

您的Delphi版本具有String = AnsiString,您依赖于系统设置的区域设置(如您在问题中所述)来选择重音字符的代码页表示,这是一个有问题的方案。如果你真的无法从Delphi 7升级,至少开始使用WideStrings和TNT Unicode控件,但我必须说努力是浪费你最好不要使用Delphi XE,只需移植到Unicode。

您的问题是“我怎么知道它们是否可以保存好?”您可以使用代码页进行编码和解码,并检查是否有任何内容被替换为“?”。例如,windows函数WideCharToMultiByte的行为与此类似。 MBCS是一个充满痛苦的世界,不值得去做,但是你问你如何找出地板从你身下掉落的地方,这样API就可以帮助你理解你选择的编码规则。

答案 1 :(得分:1)

使用WideCharToMultiByte函数 - http://msdn.microsoft.com/en-us/library/dd374130(v=vs.85).aspx并检查lpUsedDefaultChar参数。

答案 2 :(得分:0)

procedure TForm1.Button2Click(Sender: TObject);
var
    ACP: Integer;
begin
    ACP := GetACP;
    Caption := 'CP' + IntToStr(ACP);
    if ACP = 1250 then
        Caption := Caption + ' is okay for Romanian language';
end;

答案 3 :(得分:0)

由于这已经列入我的研究列表一段时间了,但尚未达到该列表的顶部,我只能通过一些链接帮助您。

您需要进行相当多的实验: - )

使用Unicode时,您可以使用函数ScriptGetCMapGetGlyphIndices来测试代码点是否在字体中。 不使用Unicode时,可以使用函数GetGlyphIndices

这些函数的Delphi翻译很少。 This Borland Newsgroup thread有一些关于使用GetGlyphIndices in Delphi的提示。 这是搜索ScriptGetCMap in Delphi

This page列出了一些有趣的API调用,可能会对您有所帮助。

一个额外的障碍是,因为并非所有字体都包含所有字符,因此Windows可以为您进行字体替换 我不知道如何弄明白,但这也是你必须要检查的东西。

祝你好运: - )