具有中文位置的FormatDateTime - 错误字符... Delphi 2007

时间:2011-01-10 22:14:00

标签: delphi localization internationalization

输出:期间:从11-Ê®¶þÔ-10到13-Ê®¶þÔ-10

以上输出来自如下行: FormatDateTime('dd-mmm-yy',dateValue)

IDE是Delphi 2007,我们正在尝试将我们的应用程序升级到中国市场。 如何显示正确的字符?

随着设置转向印地语(印度),而不是有趣的角色,我有“?”。

我正在尝试使用ReportBuilder 11在报表上显示日期。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

这些角色似乎是正确的,只有IMO才会被渲染错误。

这就是我所做的:

  • 复制了OP提供的字符串(“11-Ê®¶þÔ-10到13-Ê®¶þÔ-10”);
  • 将其粘贴到带有CP 1252(Windows Latin-1)的空白纯文本编辑器窗口中并保存;
  • 在浏览器中打开文本文件;
  • 文本显示与浏览器选择相同的代码页相同,所以我打开了字符编码的自动检测,暗示内容是中文;
  • 文本更改为“11-十二月-10至13-十二月-10”(希望您的浏览器在此处显示正确的中文字符,无论如何都会这样做)并且代码页更改为GB18030(然后我尝试了GB2312 ,但文字不会改变);
  • 好吧,我好奇并搜索了“十二月”,结果证明它代表“十二月”,非常适合上下文,除非月份名称已被混淆。

所以,这就是为什么我认为这是一个文本呈现(或者你称之为,我对这个术语不太确定)的问题。

编辑:当然,它必须与选择用于存储字符串的数据类型有关。如果函数结果是AnsiString并且变量是WideString,那么这些字符可能会转换为WideChars,因此它们不再是多字节字符的单字节组合,而是自己的多字节字符?至少那是当OP在这里发布时发生的事情。

我实际上并不知道,但如果是这样,那么我怀疑它们是否可以正确呈现,除非转换回来并作为AnsiString的一部分呈现。

答案 1 :(得分:2)

另一种解决方案是使用TntControls。它们是一组增强的标准Delphi控件,支持Unicode。您必须浏览所有表单文件并替换

Button1: TButton
Label1: TLabel

与TTntButton,TTntLabel等。

请注意,就目前而言,不仅仅是中国人不会工作。尝试使用除标准欧洲集(拉丁语+压力标记等)以外的符号的任何语言,例如俄语。

但是

通过更换控件,您将解决问题的一部分。另一部分是在使用“string”或“AnsiString”和“char / pchar”或“AnsiChar / PAnsiChar”的任何地方,只能以默认系统编码存储字符串。

例如,如果您的系统编码(“非unicode程序的语言”)是EN / US,当您将它们分配给“string”变量时,俄语字符将被替换为问号:

a: WideString;
b: string;
...
a := 'ЯУЭФЫЦ'; //WideString can store international characters
b := a; //string cannot, so the data is lost - you cannot restore it from just "b"

要存储与系统编码无关的字符串数据,请使用WideString / WideChar / PWideChar 和相应的函数。如果你有

a, b: WideString;
...
a := UpperCase(b);

然后unicode信息仍会丢失,因为UpperCase()接受“string”:

function UpperCase(const S: string): string;

您的WideString将转换为“字符串”(丢失所有国际字符),给予UpperCase,然后结果将转换回WideString,但已经太晚了。

因此,您必须使用Wide版本替换所有字符串函数:

a := WideUpperCase(b);

(对于某些函数,它们的宽版本不可用或调用不同,TntControls也包含一堆宽函数版本)

答案 2 :(得分:0)

中国市场需要支持多字节字符集(WideChar或Unicode) Delphi 2007 RTL / VCL仅支持单字节字符集(RTL和VCL中对WideChar的支持非常有限)。

最简单的方法是升级到支持Unicode的Delphi版本(Delphi 2009是第一个支持Unicode的版本,目前的Delphi版本是Delphi XE)。

或者您需要更新所有组件以支持WideChar,并重写您需要WideChar支持的RTL / VCL部分。

- 的Jeroen

答案 3 :(得分:0)

  1. 您是否在Windows中安装了Far East charset支持?在Windows pre 7(或Vista)中,默认情况下不会在西方版本中安装这些字符集,您必须在控制面板中添加它们 - >区域定居点,IIRC
  2. 使用非Unicode版本的Delphi,不幸的是可以显示哪个字符取决于当前的代码页。例如,如果它不是中国的那个,则无法显示您需要的字符。实际显示的字符取决于您使用的代码在当前代码页中的映射方式。您可以使用多语言版本的Windows完全切换到您需要的语言环境,或者您必须使用Unicode版本的Delphi(从2009年开始)。