输出:期间:从11-Ê®¶þÔ-10到13-Ê®¶þÔ-10
以上输出来自如下行: FormatDateTime('dd-mmm-yy',dateValue)
IDE是Delphi 2007,我们正在尝试将我们的应用程序升级到中国市场。 如何显示正确的字符?
随着设置转向印地语(印度),而不是有趣的角色,我有“?”。
我正在尝试使用ReportBuilder 11在报表上显示日期。
非常感谢任何帮助。
答案 0 :(得分:2)
这些角色似乎是正确的,只有IMO才会被渲染错误。
这就是我所做的:
所以,这就是为什么我认为这是一个文本呈现(或者你称之为,我对这个术语不太确定)的问题。
编辑:当然,它必须与选择用于存储字符串的数据类型有关。如果函数结果是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)