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

2024-03-15

我的应用程序是用 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 ansistringDelphi 7 中的转换,依赖于GetACPAPI调用,即系统代码页。

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

Delphi 7 使用此系统代码页,为所有转换 API 调用提供 0。如此风流SetThreadLocale不会影响widestring to ansistringDelphi 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(使用前将#替换为@)

Delphi 7 中宽字符串到字符串的转换 的相关文章

随机推荐

  • 有没有办法将开关与 String.contains("") 集成?

    我需要检查 String 对象是否包含 各种子字符串 并根据结果执行不同的代码片段 目前我有一系列的 else if 如果可能的话 我想将其转换为开关 有没有办法做到这一点 现在 if SomeString contains someSub
  • 编写 SQL 查询以删除 Woocommerce 中的旧订单

    我想删除 Woocommerce 中的一些旧订单数据 仅保留最近 12 个月的订单数据 这是我用来删除所有订单的 SQL 查询 DELETE FROM wp woocommerce order itemmeta DELETE FROM wp
  • Android - 相机功能指南

    我正在使用 SDK CameraPreview 中的示例以及此站点中的示例http marakana com forums android android examples 39 html http marakana com forums
  • 获取当前位置(GPS/WiFi)

    我正在尝试使用它来获取我的位置 如下所示 LocationManager myLocationManager LocationManager getSystemService Context LOCATION SERVICE Criteri
  • 如何在打字稿中组织类型/接口声明?

    我对打字稿有点陌生 让我有点困惑的事情之一是类型 接口声明 我正在编写一个库 当前有一些类和更多类型 接口声明 我在大部分代码中使用这些类型 接口 最初我会将它们保留在一个文件中types文件夹 然后我会在需要的地方导入它们 现在我有一个m
  • 如何使用 Python 获取 Selenium WebDriver 中的用户代理信息

    我正在尝试获取我在 Selenium 中使用的实际用户代理 目前使用chromedriver 我找到了这个问题的Java版本 如何在 Selenium Web 驱动程序中获取 userAgent 信息 https stackoverflow
  • 如何获取相对和绝对光标位置?

    我怎样才能得到当前光标位置与SWT I need The absolute位置 仅相对于当前Display 位置relative到当前活动的Control 这获取光标位置相对于当前显示 import org eclipse swt widg
  • 如何在 Scala 的 Play!2 表单中包含图片类型?

    根据本指南 http www playframework org documentation 2 0 2 ScalaFileUpload 可以通过手写html表单来上传文件 我想将文件上传作为包含文本字段 例如姓名和电子邮件 的更大表单的一
  • 使用 ng-repeat 或 ng-options 时如何删除初始空白选项并选择

    有角度的新手 过滤通过dataservice返回的json数据 过滤是通过dropdown完成的 我想做的是结合以下几点 我想删除通过 Angular 返回的初始空白值 我还想让它预先选择一个默认值 该值不是 包含在我的数据对象中 在我的例
  • 在 Swift 2.0 中更改 NSView 的背景颜色

    我正在尝试更改 NSView 的背景颜色 并尝试了中概述的解决方案之一这个答案 https stackoverflow com questions 26553444 swift nsviewcontroller background col
  • Zookeeper:主机名解析失败

    我在 OpenShift Kubernetes 环境中运行 Zookeeper 我已将 Zookeeper 设置为StatefulSet为了可靠地保存配置数据 我在我的配置中配置了三台服务器zoo cfg通过主机名 但在启动时 主机名解析失
  • Base64编码中为什么要使用padding? [复制]

    这个问题在这里已经有答案了 可能的重复 如果输入长度不能被3整除 为什么base64编码需要填充 https stackoverflow com questions 4080988 why does base64 encoding requ
  • 为什么用户登录后看不到动画?

    我创建了一个自定义 LaunchSreen 当用户未登录时它运行良好 但如果他登录了 我们就看不到动画 视图会直接转到主视图 并且不等待动画完成 你知道为什么吗 import SwiftUI struct LaunchScreen View
  • 在 Google 地图片段中显示当前位置

    我目前正在开发一个带有 Google 地图的片段 一旦用户访问该片段 他的地图应该缩放并聚焦于他的位置 但是 它显示世界地图而不是附近位置 靠近用户 SuppressWarnings unused public class Deferred
  • 数据断点是如何创建的?

    我只是想知道如何数据断点 又名观察点 创建了吗 我知道常见的断点是使用 x86 上的一些特殊 INT3 指令创建的 我想你可以创建software通过定期扫描内存来观察点 但是从编写带有硬件断点的自己的调试器的角度来看 我在Windows
  • 为什么要使用 pytest 工厂作为固定装置而不是工厂函数?

    In the py test 文档 https docs pytest org en latest fixture html factories as fixtures它描述了将工厂方法声明为固定装置 如下所示 pytest fixture
  • 停止多线程 Windows 服务

    我在 Net 3 5 中有一个多线程 Windows 服务 当创建多个线程时 我在正确停止该服务时遇到了一些麻烦 该服务过去只创建一个线程来完成所有工作 我只是将其更改为多线程 它工作得很好 但是当服务停止时 如果有多个线程正在执行 它将挂
  • 如何使用命令行将所有 .pdf 文件名打印到输出文件?

    这在 Linux 中似乎很容易 但我正在尝试打印以下名称 pdf目录及其子目录中的文件到输出文件 我在 Windows 机器上安装了 Perl 有什么简单的方法可以做到这一点 和Linux没多大区别 dir pdf gt fileyouwa
  • ./node_modules/css-loader 中出现错误?:ENOENT:没有这样的文件或目录 node_modules/node-sass/vendor

    我试图在 Windows 10 中运行一个 Angular 项目 这与我在 Ubuntu 中做的项目是同一个项目 当我克隆存储库并安装所有节点包时 我遇到了此错误 错误于 node modules css loader sourceMap
  • Delphi 7 中宽字符串到字符串的转换

    我的应用程序是用 Delphi 7 编写的非 unicode 应用程序 我想使用此函数将 unicode 字符串转换为 ANSI function convertU ws widestring string begin result str