扩展的ASCII字符显示为? (问号)

时间:2016-02-25 10:50:11

标签: delphi delphi-7

我有一个带有一堆标志的表格(静态图像),每个标志下面都是一个勾选框。用户选择复选框以允许他们使用特定语言。在设计时,我为其本地化的等效语言设置了每种语言的复选框标题,在本例中为“Español”(西班牙语)。

Design-time Spanish image and checkbox

几乎每种语言都可以在运行时显示,但是对于几种语言,这会改为“Espa?ol”。具体来说,当我选择立陶宛语并使用:

时会发生这种情况
// Note: 1063 = ((SUBLANG_DEFAULT shl 10) or LANG_LITHUANIAN)
SetThreadLocale(1063);

Spanish text at runtime (without modification)

奇怪的是,如果我只是在表单的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,也不知道如何解决问题)。

1 个答案:

答案 0 :(得分:8)

?字符是从一个代码页转换到另一个代码页失败的情况,因为目标代码页不包含所需的字符。这是针对ANSI Win32 API编程的必然结果。您根本无法代表所有语言中的所有字符。

唯一可行的方法是使用Unicode。从Delphi 7开始,您有两个主要选项:

  1. 坚持使用Delphi 7并使用TNT Unicode组件。
  2. 升级到Delphi的现代版本,该版本具有对Unicode的本机支持。