我有一个带有一堆标志的表格(静态图像),每个标志下面都是一个勾选框。用户选择复选框以允许他们使用特定语言。在设计时,我为其本地化的等效语言设置了每种语言的复选框标题,在本例中为“Español”(西班牙语)。
几乎每种语言都可以在运行时显示,但是对于几种语言,这会改为“Espa?ol”。具体来说,当我选择立陶宛语并使用:
时会发生这种情况// Note: 1063 = ((SUBLANG_DEFAULT shl 10) or LANG_LITHUANIAN)
SetThreadLocale(1063);
奇怪的是,如果我只是在表单的OnShow处理程序中使用以下行重新应用标题,那么它会正确显示为“Español”。
tbLangSpanish.Caption := 'Español'; // Strange, it now corrects itself!
通过检查运行时标题是否有“?”,可以稍微改进上面的代码。其中的字符然后才重新应用标题。应用程序的其余部分完美地显示立陶宛语(标签在运行时设置)。
请注意,“ñ”是扩展的ASCII码241.此问题会影响其他一些扩展字符,例如“Français”中的“ç”(字符231)。有趣的是,某些扩展的ASCII字符正确显示,例如。 “¾”(角色190)。
这是IDE中的错误(使用Delphi 7)还是遗留ASCII(即非UNICODE)字符的事实?是否有一种首选方法可以在运行时检测不兼容的设计时扩展ASCII字符(可能基于区域设置)?
我执行的搜索都没有解释为什么角色会显示为“?”。我假设这是因为当前Windows代码页中必须缺少所请求的字符,但没有明确说明发生这种情况时显示的内容(如果不能使用UNICODE,也不知道如何解决问题)。
答案 0 :(得分:8)
?
字符是从一个代码页转换到另一个代码页失败的情况,因为目标代码页不包含所需的字符。这是针对ANSI Win32 API编程的必然结果。您根本无法代表所有语言中的所有字符。
唯一可行的方法是使用Unicode。从Delphi 7开始,您有两个主要选项: