1

我需要LST ISO/IEC 8859-13在窗口上显示代码页字符。目前我正在ShowMessage为此目的使用函数。当 Windows 语言环境来自该地区时,Evrything 显示正常,但是当我有例如语言环境英语英国时如何处理?在这种情况下,我只有“?” 而不是性格。显示区域字符应该是某种可能性,因为 MS Word 在没有正确区域设置的情况下显示它们。但是怎么做呢?

4

3 回答 3

2

你有两个可行的、易于处理的选择:

  1. 升级到内置支持国际文本的 Unicode 版本的 Delphi,或
  2. WideString通过使用使用 Unicode 编码的 COM 类型,使用将支持移植到 Unicode 之前的 Delphi 的 TNT Unicode 控件。

Word 这样做没有问题,因为它使用 Windows 的本机 Unicode API。另一方面,Delphi 7 使用的 ANSI API 仅用于提供与 Windows 95/98/ME 的兼容性。

于 2014-09-09T12:23:47.303 回答
1

精简版:

如果您想(更多)确定特定组件将显示给定字符集中的字符,则还必须设置 Font.Charset 属性。

长版(对不起:我容易罗嗦)

使用 unicode(如果您还没有这样做,您应该切换到 unicode 版本的 delphi)并不能保证安装在外国 pc 上的字体将包含您要显示的所有符号。此外,使用 unicode 并不会强制操作系统选择实际支持您需要的字符集的字体:即使安装了能够显示西里尔字符的字体,Windows 也不会仅仅因为您要求他选择该字体渲染一个包含西里尔 unicode 代码点的字符串:它仍将使用默认系统字体。

所以:您总是有可能需要让您的客户安装支持您的应用程序需要的字符集的字体。如果这可能是一个严重的问题,您应该考虑将所需字体与您的二进制文件一起分发的想法(注意字体版权)。第二:如果您的应用程序中有组件,您确信它们将始终显示俄语文本,那么,在这些组件中您必须指定 Font.Charset = RUSSIAN_CHARSET。这是告诉窗口“我真的需要在这个组件中显示西里尔字符,所以选择合适的字体,不管你在地球的哪一边”

一个常见的误解是 che charset 属性对 unicode 程序毫无用处。恰恰相反。

另一个常见错误是假设“XYZ”字体在世界上所有 Windows 安装中都是相同的,因此,如果我可以在我的电脑上看到带有 Thamoa 的西里尔字符,那么我可以安全地使用 Thamoa 在世界其他地方显示西里尔字母. 恰恰相反:根据计算机区域设置安装不同的 unicode 子集。

并且...由于 AFAIK ShowMessage() 使用系统默认字体,因此您不能使用此过程来显示包含“奇怪”字符的消息:您需要编写自己的 ShowMessage 对话框。

编辑:这是一个例子,展示了我在说什么

只需在表单上放置一个 TPaintBox 组件,将其命名为“pbox”,然后编写此 OnPaint 事件处理程序:(请记住将源代码保存为 utf-8 格式,否则俄罗斯符号将被破坏)

procedure TForm1.pboxPaint(Sender: TObject);
begin
   pbox.canvas.Font.Name := 'Fixedsys';
   pbox.Canvas.TextOut(0,0,'Это русский'); 

   pbox.canvas.Font.Name := 'Fixedsys';
   pbox.canvas.Font.Charset := RUSSIAN_CHARSET;
   pbox.Canvas.TextOut(0,20,'Это русский'); 
end;

在意大利电脑上(我猜在任何西欧或美国电脑上)fixedsys 字体通常不包含俄语字符符号:第一个 TextOut 将坚持使用 FixedSys 字体并写垃圾。例如,在我的电脑上,我得到了一系列黑色方框。

第二个文本输出是在设置 charset=RUSSIAN_CHARSET 之后进行的,因此 windows 将知道我们需要俄罗斯符号并因此选择另一种字体。第二个 TextOut 没有使用我想使用的 FixedSys 字体,但至少它是可读的!

在俄文安装的 Windows 中,两个 TextOut 调用都将使用 FixedSys 字体正确呈现俄文文本,因为俄文安装的 Windows 具有俄文版本的 fixedsys 字体。Windows 知道这一点。

于 2014-09-11T12:15:28.430 回答
0

您可以在 Windows 系统上安装多个语言环境。如果您使用匹配的语言环境,则它是默认语言环境,您可以使用带有文本字段的对话框,该文本字段使用正确的语言环境/字符集。在安装了 English UK 的开发系统上,添加缺少的语言。

Unicode 更好,但不需要显示来自非默认字符集的字符(在 Uincode 发明之前,计算机能够处理许多字符集)。甚至 MS Wordpad 也能够显示来自不同代码页的字符,包括早在 Unicode 存在之前的多字节字符集(韩文、日文、中文)。

ShowMessage 不能使用,因为它坚持默认语言环境。但可以很容易地替换为自定义对话框样式的表单。

于 2014-09-09T12:24:55.963 回答