我需要在窗口上显示LST ISO/IEC 8859-13
代码页字符。目前我正在使用ShowMessage
功能。当windows locale来自这个区域时,Evrything显示正常,但是当我有例如locale English UK时如何处理?在这种情况下,我只是“?”而不是角色。显示区域字符应该是某种可能性,因为MS Word在没有正确的语言环境的情况下显示它们。但是怎么做呢?
答案 0 :(得分:2)
你有两个可行,易处理的选择:
WideString
类型将支持移植到Unicode前Delphi上。Word在执行此操作时没有任何问题,因为它使用Windows的本机Unicode API。另一方面,Delphi 7使用仅存在的ANSI API来提供与Windows 95/98 / ME的兼容性。
答案 1 :(得分:1)
简短版本:
如果您希望(更确定)特定组件将在给定字符集中显示字符,您还必须设置Font.Charset属性。
长版(对不起:我很容易罗嗦)
使用unicode(你应该切换到unphi的unicode版本,如果你还没有完成),并不能保证外国电脑上安装的字体会包含你想要显示的所有符号。 此外,使用unicode不会强制操作系统选择实际支持您需要的字符集的字体:即使安装的字体能够显示西里尔字符,窗口也不会因为您要求他而选择该字体渲染一个包含西里尔字母代码点的字符串:它仍将使用默认的系统字体。
所以:总是有可能需要让客户安装支持应用程序所需字符集的字体。如果这可能是一个严重的问题,你应该考虑分发所需字体和二进制文件的想法(小心使用字体copirights)。 第二位:如果您的应用程序中有组件,您确定它们将始终显示俄语文本,那么,在这些组件中,您必须分配Font.Charset = RUSSIAN_CHARSET。这是告诉窗口的方式"我真的需要在这个组件中显示西里尔字符,所以选择一个合适的字体,无论你在哪个星球上运行"
一种常见的误解是che charset属性对unicode程序没用。情况正好相反。
另一个常见错误是假设" XYZ"在世界上所有的Windows安装中,字体是相同的,所以,如果我能在我的电脑上看到Thamoa的西里尔字母,那么我可以安全地使用Thamoa在世界其他地方展示西里尔字母。完全相反:根据计算机区域设置安装不同的unicode子集。
和...由于AFAIK ShowMessage()使用系统默认字体,因此您无法使用此过程显示包含" strange"字符:您需要编写自己的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字体并将写入垃圾。例如,在我的电脑上,我得到了一系列黑色方框。
第二个textout是在设置charset = RUSSIAN_CHARSET之后制作的,因此windows会知道我们需要俄语符号,所以选择另一种字体。第二个TextOut没有使用我想使用的FixedSys字体,但至少它是可读的!
在Windows的俄语安装中,两个TextOut调用都将使用FixedSys字体正确呈现俄语文本,因为俄语安装的windows具有俄语版本的fixedsys字体。而Windows知道它。
答案 2 :(得分:0)
您可以在Windows系统上安装多个区域设置。如果您使用匹配的区域设置,那么它是默认的区域设置,您可以使用带有文本字段的对话框,该文本字段使用正确的区域设置/字符集。在安装了英语UK的开发系统上,添加缺少的语言。
Unicode更好,但不需要显示非默认字符集中的字符(计算机能够在发明Uincode之前处理许多字符集)。甚至MS Wordpad也能够在Unicode存在之前显示来自不同代码页的字符,包括多字节字符集(韩语,日语,中文)。
无法使用ShowMessage,因为它坚持使用默认语言环境。但可以很容易地用自定义对话框样式替换。