首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有中文位置的FormatDateTime -字符错误...Delphi 2007

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

Stack Overflow用户
提问于 2011-01-11 06:14:00
回答 4查看 1.1K关注 0票数 0

输出:周期:从11--10到13--10

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

集成开发环境是Delphi 2007,我们正在努力让我们的应用程序适应中国市场。如何显示正确的字符?

随着设置转向印地语(印度),而不是有趣的字符,我有"?“。

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

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2011-01-11 18:22:15

这些字符看起来是正确的,只是我认为它们是错误的。

下面是我所做的:

使用CP 1252 (Windows 13-Ê®¶þÔÂ-10");

  • pasted -1),
  • 复制了OP所显示的字符串(“11--13-Ê®¶þÔÂ-10”);
  • pasted“-10以将其保存到空白纯文本编辑器窗口中;
  • 在浏览器中打开文本文件;
  • 文本显示与浏览器选择相同的代码页时相同,因此我打开了字符编码的自动检测,提示内容为中文;
  • 文本更改为“11- change);
  • well,-10 to 13-十二月-10”(希望您的浏览器在这里显示正确的中文字符,我也是这样做的),代码页更改为GB18030 (然后我尝试了GB2312,但文本不会我好奇地搜索了"十二月",结果它代表“12月”,非常适合上下文,除非月份的名称搞混了。

)

所以,这就是为什么我认为这是一个文本渲染(或者无论你怎么叫它,我不是很确定这个术语)的问题。

EDIT:当然,这一定与存储字符串所选择的数据类型有关。如果函数结果是AnsiString,变量是WideString,那么字符可能会被转换为WideChars,因此它们不再是多字节字符的单字节组合,而是多字节字符本身吗?至少当特工把他们放在这里的时候是这样的。

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

票数 2
EN

Stack Overflow用户

发布于 2011-01-11 20:48:23

另一种解决方案是使用TntControls。它们是一组标准的Delphi控件,增强了对Unicode的支持。你必须仔细检查你所有的表格文件并替换

代码语言:javascript
复制
Button1: TButton
Label1: TLabel

使用TTntButton、TTntLabel等。

请注意,在目前的情况下,不仅仅是中文不能工作。尝试使用除标准欧式设置(拉丁语+重音符号等)之外的任何语言,例如俄语。

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

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

代码语言:javascript
复制
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和相应的函数。如果你有

代码语言:javascript
复制
a, b: WideString;
...
a := UpperCase(b);

那么unicode信息仍然会丢失,因为UpperCase()接受"string":

代码语言:javascript
复制
function UpperCase(const S: string): string;

您的字符串将被转换为“WideString”(丢失所有国际字符),并提供给UpperCase,然后结果将被转换回WideString,但为时已晚。

因此,您必须将所有字符串函数替换为宽版本:

代码语言:javascript
复制
a := WideUpperCase(b);

(对于一些函数,它们的宽版本是不可用的,或者调用方式不同,TntControls还包含一堆宽版本的函数)

票数 2
EN

Stack Overflow用户

发布于 2011-01-11 15:38:44

中国市场要求支持多字节字符集( WideChar或Unicode)。

Delphi2007RTL/VCL只支持单字节字符集(在RTL和VCL中对WideChar的支持非常有限)。

对你来说最简单的是升级到支持Unicode的Delphi版本(Delphi 2009是第一个支持Unicode的版本,当前的Delphi版本是Delphi XE)。

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

--jeroen

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4652130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档