Delphi 7-为什么Windows 7在运行时更改字符编码?

Delphi 7-为什么Windows 7在运行时更改字符编码?,delphi,encoding,windows-7,delphi-7,Delphi,Encoding,Windows 7,Delphi 7,我有一个delphi 7表格: 我的代码是: 在Windows 7中运行此表单时,我看到: 在设计时,表单在第一个标签中有波兰字母,但在运行时并没有。它在Vista或Windows XP上看起来不错。当我在代码中设置第二个标签的标题时,一切工作正常,字符编码正确 Windows 7上顶部标签的前5个代码:65 97 69 101 83 Windows Vista/XP上顶部标签的前5个代码:165 185 202 234 140 每个系统上底部标签的前5个代码:165 185 202

我有一个delphi 7表格:

我的代码是:

在Windows 7中运行此表单时,我看到:

在设计时,表单在第一个标签中有波兰字母,但在运行时并没有。它在Vista或Windows XP上看起来不错。当我在代码中设置第二个标签的标题时,一切工作正常,字符编码正确

Windows 7上顶部标签的前5个代码:65 97 69 101 83

Windows Vista/XP上顶部标签的前5个代码:165 185 202 234 140

每个系统上底部标签的前5个代码:165 185 202 234 140

Windows7改变了编码,为什么?我的系统设置似乎正常。我在控制面板中为非unicode应用程序设置了适当的语言

编辑


此问题不仅与表单上的标签有关,还与FastReport(切换到EASTERN_字符集可解决此问题)或通过COM接口访问Microsoft Excel有关

检查标签的Font.Charset属性。虽然我不知道它是如何更改的(它是为某个向导预先创建的吗?),但它可能与系统环境不同。

我在win XP的Delphi 2010中重现了该行为

procedure Button1Click(Sender : TObject);
begin
  ShowMessage(AnsiString(Label1.Caption));
end;
在这种情况下,Label1.Caption到AnsiString的转换是通过(WindowsAPI)完成的

API有以下注释:

ANSI代码页可以不同 在不同的计算机上,或者可以是 更改为单台计算机,领先 防止数据损坏。最多 一致的结果、应用 应使用Unicode,如UTF-8或 UTF-16,而不是特定代码 页面,除非旧标准或数据 格式阻止使用Unicode。如果 使用Unicode是不可能的, 应用程序应该标记数据 具有适当编码的流 协议允许时命名。HTML和 XML文件允许标记,但不允许文本 文件没有

因此,我最好的猜测是,行为上的差异来自这样一个事实,即您的Windows 7版本与vista/XP工作站上的活动代码页不同


我仍然需要找到如何在系统上获取活动代码页。。。我最好的猜测是它是在控制面板的区域设置中定义的。但我仍然需要验证…

此问题的答案解决我的问题:

一个解决方案:

我们发现奇怪的是,通过控制面板切换到不同的区域设置,然后切换回新西兰解决了这个问题。我很想知道,如果你只是为了验证我们看到的是相同的现象,那么同样的解决方法是否能解决这个问题。 第二:

initialization
  SetThreadLocale(LOCALE_USER_DEFAULT);
  GetFormatSettings;

两个解决方案都很好,应用程序消失的问题。

你碰到了我在Tr.TrimeWrreStudio和Trrist.Read Stand方法中考虑的一个“bug”。Delphi内部使用这两种方法在设计时将TLabel.Caption从实际的活动对象移动到DFM文件中,然后在运行时返回到活动对象中

如果您查看上面提到的两个例程的代码,您会注意到(我假设您会感到震惊),进入流的实际内容使用操作系统的默认代码页转换为Unicode!只要开发机器上使用的代码页与测试机器上使用的代码页完全匹配,并且它们可能不匹配,这就是您得到错误的最可能原因。请注意,您为表单上的标题设置的东欧字符集绝对没有任何值,因为TWriter.WriteString方法对此一无所知

我在QC上有一个关于这个问题的错误报告,它已经存在很多年了。。。他们可能认为这是“设计的”,但我认为这不是一个很好的设计

我推荐的解决方案是快速切换到Delphi2010。我是罗马尼亚的一名Delphi开发人员,在这方面我遇到了很多问题,但现在一切都过去了,因为Delphi2010是UNICODE,所以我不再需要担心代码页转换


如果无法切换到Delphi 2010,您可能希望“破解”Classes.pas文件,并更改TReader.ReadString例程,以便始终使用您的代码页而不是系统默认值进行转换。

我不熟悉Delphi,但表单设计器是否允许指定与默认代码页不同的编码(即Windows-1250)?这是什么版本的Delphi?IIRC Unicode支持最近才添加…@0xA3这是Delphi 7,它不是Unicode应用程序,但我在区域设置中为非Unicode应用程序设置了波兰语。这就是为什么Label2显示正确,但第一个仍然不起作用。您是否检查了Label1和Label2在t中的定义DFM?Label1.caption是如何保存在DFM中的?@Ken Bourassa DFM stores
\260\261\280\281\346\347\262\323\324
。这看起来像Unicode。字母匹配Unicode代码,所以DFM没有问题。如果在XP或Vista兼容模式下运行应用程序(右键单击兼容属性、属性、exe)是否有效?表单的Font.Charset设置为默认值\u Charset,标签的ParentFont设置为true。控制面板设置似乎正常。我确信这是Windows 7采用另一种方法进行字符串转换的问题,但如何解决?请尝试在不同的系统上从应用程序调用GetThreadLocale,以确保相同的值为ret在我们进一步调查之前,我已经准备好了…好主意。我明天会这样做。很高兴知道,但这个问题只与Windows 7有关,我已经找到了一个解决方案。切换到Delphi 2010将非常复杂。我的应用程序大量使用JVCL 2和其他旧组件,大约有1000个表单。Delphi 2010正在等待更多的备用表单时间