我的应用程序是用 Delphi 7 编写的非 unicode 应用程序。
我想使用此函数将 unicode 字符串转换为 ANSI:
function convertU(ws : widestring) : string;
begin
result := string(ws);
end;
我还使用此代码来设置要转换的正确代码页。
initialization
SetThreadLocale(GetSystemDefaultLCID);
GetFormatSettings;
它在 VCL 主线程中工作得很好,但在 TThread 中则不然,
我得到一些问号'?'作为函数的结果convertU.
为什么不在 TThread 中?
AFAIK SetThreadLocale
不会更改当前系统代码页,因此不会影响widestring
to ansistring
Delphi 7 中的转换,依赖于GetACP
API调用,即系统代码页。
系统代码页设置为在 Windows 7 的控制面板中,然后选择区域语言/管理选项卡/非 Unicode 应用程序的代码页。这需要重新启动系统。
Delphi 7 使用此系统代码页,为所有转换 API 调用提供 0。如此风流SetThreadLocale
不会影响widestring
to ansistring
Delphi 7 中的转换。它将更改区域设置(例如日期/时间和货币格式),而不是系统用于其 Ansi Unicode 转换的代码页。
新版本的 Delphi 有一个SetMultiByteConversionCodePage()
函数,能够设置所有代码页使用AnsiString
处理。
但是 API 调用(即所有....A()
功能于Windows.pas其映射为...()
在 Delphi 7 中)将使用此系统代码页。所以你必须打电话给...W()
如果您想处理另一个代码页,则在转换为 Unicode 后使用宽 API。也就是说,Delphi 7 VCL 仅适用于系统代码页,而不适用于由SetThreadLocale
.
在Delphi 7下,我的建议是:
- Use
WideString
无处不在,以及特定的“广泛”API 调用 - Delphi 7 有几组组件可以处理WideString
;
- 使用您自己的类型和专用字符集,但在使用 VCL/RTL 或“Ansi” API 调用之前您需要显式转换 - 例如
MyString = type AnsiString
(这就是我们在 mORMot 中所做的,通过定义一个自定义RawUTF8
内部 UTF-8 进程的类型)。
Delphi 2009 及更高版本可以更好地处理此问题,因为您可以为每个AnsiString
类型,并正确处理与 Unicode 的转换,以用于 API 调用或 VCL 进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)