gpt4 book ai didi

delphi - Delphi 7 中宽字符串到字符串的转换

转载 作者:行者123 更新时间:2023-12-03 14:57:51 24 4
gpt4 key购买 nike

我的应用程序是一个用 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 不会更改当前系统代码页,因此不会影响 Delphi 7 中的 widestringansiststring 转换,这依赖 GetACP API 调用,即系统代码页。

系统代码页设置为在 Windows 7 的控制面板中,然后选择区域语言/管理选项卡/非 Unicode 应用程序的代码页。这需要重新启动系统。

Delphi 7 使用此系统代码页,为所有转换 API 调用提供 0。因此 AFAIR SetThreadLocale 不会影响 Delphi 7 中的 widestringansistring 转换。它将更改区域设置(例如日期/时间和货币格式) ),而不是系统用于其 Ansi <-> Unicode 转换的代码页。

较新版本的 Delphi 有一个 SetMultiByteConversionCodePage() 函数,能够设置用于所有 AnsiString 处理的代码页。

但是 API 调用(即 Windows.pas 中的所有 ....A() 函数由 ...() 映射> 在 Delphi 7) 中将使用此系统代码页。因此,如果您想处理另一个代码页,则必须在转换为 Unicode 后调用 ...W() 宽 API。也就是说,Delphi 7 VCL 仅适用于系统代码页,而不适用于 SetThreadLocale 指定的值。

在 Delphi 7 下,我的建议是:

  • 在任何地方使用 WideString,以及特定的“Wide”API 调用 - Delphi 7 有几组组件可以处理 WideString
  • 使用您自己的类型和专用字符集,但在使用 VCL/RTL 或“Ansi”API 调用之前您需要进行显式转换 - 例如MyString = type AnsiString(这就是我们在 mORMot 中所做的,通过为内部 UTF-8 进程定义自定义 RawUTF8 类型)。

使用 Delphi 2009 及更高版本可以更好地处理此问题,因为您可以为每个 AnsiString 类型指定代码页,并为 API 调用或 VCL 进程正确处理与 Unicode 之间的转换。

关于delphi - Delphi 7 中宽字符串到字符串的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12337123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com