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

Extended ASCII characters displayed as ? (question mark)

我有一个带有一堆标志(静态图像)的表单,每个标志下方都有一个勾选框。用户 select 勾选复选框以允许他们使用特定语言。在 design-time,我为每种语言设置了相应的本地化复选框标题,在本例中为 "Español"(西班牙语)。

对于几乎所有语言,这在运行时都显示得很好,但对于一些语言,这会变为 "Espa?ol"。具体来说,当我 select 立陶宛语并使用:

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

奇怪的是,如果我只是 re-apply 表单的 OnShow 处理程序中带有以下行的标题,那么它会正确显示为 "Español"。

tbLangSpanish.Caption := 'Español';  // Strange, it now corrects itself!

通过检查运行时标题是否有“?”,上述代码可能会略有改进。其中的字符,然后才 re-apply 标题。应用程序的其余部分完美显示立陶宛语(标签在运行时设置)。

请注意,“ñ”是扩展 ASCII 代码 241。此问题会影响其他几个扩展字符,例如 "Français" 中的“ç”(字符 231)。有趣的是,一些扩展的 ASCII 字符可以正确显示,例如。 "¾"(字符 190)。

这是 IDE(使用 Delphi 7)中的一个错误,还是只是一个带有遗留 ASCII(即 non-UNICODE)字符的 fact-of-life?是否有一种首选方法可以在运行时检测不兼容的 design-time 扩展 ASCII 字符(可能基于语言环境)?

None 我执行的搜索给出了关于为什么字符显示为“?”的任何解释。我假设这是因为当前 Windows 代码页中必须缺少请求的字符,但我找不到任何参考资料明确说明发生这种情况时显示的内容(也没有说明如果不能使用 UNICODE 如何解决问题) .

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

唯一现实的前进方式是使用 Unicode。您有两个主要选项,从 Delphi 7:

开始
  1. 坚持 Delphi 7 并使用 TNT Unicode 组件。
  2. 升级到 Delphi 的现代版本,它原生支持 Unicode。