使用 Delphi 6 处理 Unicode 字符

2023-11-23

我有一个用 Delphi 6 开发的轮询应用程序。 它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 精简版)

我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如日本操作系统。 因此,我们将 SQL Server 中的数据库字段从 varchar 更改为 nvarchar。

轮询在具有 DBCS 的操作系统中运行良好。它也适用于非 DBCS 操作系统,如果 系统区域设置设置为日文/中文/韩文,操作系统有相应的语言包。 但是,如果区域设置设置为英语,那么数据库将包含双字节字符的垃圾字符。

我进行了一些测试,但未能找到解决方案。

例如如果我读到UTF-8使用 TStringList 文件并将其保存到另一个文件,然后保存 Unicode 数据。 但是,如果我使用文件的内容使用 TADOQuery 组件运行更新查询,则会显示垃圾字符。 该数据库还包含垃圾字符。

PFB示例代码:

var
    stlTemp : TStringList;
    qry : TADOQuery;
    stQuery : string;
begin
    stlTemp := TStringList.Create;
    qry := TADOQuery.Create(nil);
    stlTemp.LoadFromFile('D:\DelphiUnicode\unicode.txt');
    //stlTemp.SaveToFile('D:\DelphiUnicode\1.txt'); // This works. Even though 
    //the stlTemp.Strings[0] contains junk characters if seen in watch

    stQuery := 'UPDATE dbo.receivers SET company = ' + QuotedStr(stlTemp.Strings[0]) +
        ' WHERE receiver_cd = N' + QuotedStr('Receiver'); 
    //company is a nvarchar field in the  database
    qry.Connection := ADOConnection1;
    with qry do
    begin
        Close;
        SQL.Clear;
        SQL.Add(stQuery);
        ExecSQL;
    end;
    qry.Free;
    stlTemp.Free
end;

上面的代码在 DBCS 操作系统中运行良好。

我尝试过使用 string、widestring 和 UTF8String。但是,如果语言环境设置为英语,则这在英语操作系统中不起作用。

请提供有关此问题的任何指示。


在非 Unicode Delphi 版本中,基础知识是您需要使用WideStrings (Unicode) 而不是Strings(安西)。

把...忘了吧TADOQuery.SQL(TStrings),并与TADODataSet.CommandText or TADOCommand.CommandText(WideString) 或类型转换TADOQuery as TADODataSet. e.g:

stlTemp: TWideStringList; // <- Unicode strings - TNT or other Unicode lib
qry: TADOQuery;
stQuery: WideString; // <- Unicode string

TADODataSet(qry).CommandText := stQuery;
RowsAffected := qry.ExecSQL;

您还可以使用TADOConnection.Execute(stQuery)直接执行查询。


对参数化查询要格外小心:ADODB.TParameters.ParseSQL是安西。如果ParamCheck为 true(默认)TADOCommand.SetCommandText->AssignCommandText会引发 如果您的查询是 Unicode (InitParameters是安西)。

(请注意,您可以使用 ADOCommand.Parameters直接使用?字符作为参数的占位符,而不是 Delphi 的约定:param_name).


QuotedStr返回 Ansi 字符串。您需要此功能的宽版 (TNT)


另外,正如@Arioch'提到的TNT Unicode Controls套件是您制作 Delphi Unicode 应用程序的最佳选择。 它具有成功管理应用程序中的 Unicode 任务所需的所有控件和类。

简而言之,你需要思考Wide :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Delphi 6 处理 Unicode 字符 的相关文章

  • Android中如何检测程序的终止?

    当 Windows 程序终止时 它会调用事件处理程序 例如 OnClose OnDestroy 和析构函数 Destroy 当我想保存一些 INI 设置时 这些地方就是我要保存的地方 我为所有这些事件编写了事件处理程序 但当我终止程序时它们
  • 在 Django admin 中保存包含非 ASCII 字符的 ImageField 时出现 UnicodeEncodeError

    我试图在 django admin inlines 中上传图像文件 并在尝试上传文件名包含非 ascii 字符的文件时收到 UnicodeEncodeError File usr local lib python2 6 site packa
  • 如何解析从java文件中读取的unicode [重复]

    这个问题在这里已经有答案了 我编写了一个包含以下内容的文本文件 u0032 u0142o u017Cy u0142 然后我使用 FileReader 和 BufferedReader 来读取文件 public static void mai
  • 为什么 MySQL 将 é 与 e 视为相同?

    我使用 Django Web 应用程序将 Unicode 字符串存储在 MySQL 数据库中 我可以很好地存储 Unicode 数据 但是在查询时 我发现 and e被视为好像它们是同一个角色 In 1 User objects filte
  • 用 unicode 字符删除纯文本?

    是否可以删除代码注释中不需要的修改过的单词 由于开发人员仍然在黑暗时代更简单的纯文本时代进行编码 其中文本无法使用隐藏标识符进行格式化 因此实现这一目标的唯一方法是使用 Unicode 字符 由于某些unicode字符可以扩展 y o n
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • DBX 错误:驱动程序无法正确初始化

    我在跑步德尔福XE3 终极版 MySQL 数据库 这是我点击时收到的错误Test Connection 作为回应 我在 xampp 目录中找到了 libmysql 库 并将其复制到我的 System32 目录中 但这是行不通的 此消息指的是
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何使用 HTML 在 IE 中显示 Unicode 字符

    我试图使用以下代码在页面底部显示版权和无穷大符号 x00A9 Copyright Mikle 2009 x221E 这在 Firefox 2 3 和 Chrome 中完美运行 不过 IE7 向我显示了实际的代码 如上所示 而不是我所期望的
  • 使用 (Object as TClass) 和 TClass(Object) 进行强制转换有什么区别

    有问题在哪里MyObj classnameis TMyClass classname 是真的并且TMyClass MyObj 有效但是 MyObj as TMyclass doSomething抛出转换错误 我真的不需要任何关于这些垃圾的帮
  • Delphi中AsInteger和Value有什么区别?

    我想知道以下两个与delphi中的数据集相关的语句之间的区别 dsMyDataSet ParamByName ID AsInteger 1122 If ID is integer dsMyDataSet ParamByName ID AsS
  • 为什么不提高EInvalidPointer?

    德尔福文档状态 http docwiki embarcadero com Libraries en System SysUtils EInvalidPointer 切勿提出E无效指针直接异常 E无效指针由内存管理器内部引发 我正在编写一个自
  • 使用 Inno Setup 中格式化(部分粗体)的文本制作安装程序?

    有人看过 GOG com 游戏安装程序吗 如何制作像这样的欢迎文本字符串 包括单个标题中的路径和需要大小 其中部分内容加粗 以下是修改安装路径后如何更改字符串换行的示例 您可以使用TRichEditViewer http www jrsof
  • PHP 和 ADODB 连接失败

    我的任务是迁移服务器 这包括移动我没有构建的应用程序 其中一些具有 ADODB connection 我似乎无法在新服务器上修复它 我只得到空白屏幕 我已经对 ADODB connection 与 PHP 进行了相当广泛的研究 但找不到明确
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile
  • 如何在 Android 上的 HttpPost 中发送 unicode 字符

    我试图在我的应用程序中允许多语言支持 这会发出 HTTP post 来上传新消息 我需要做什么才能支持日语和其他非拉丁语语言 我的代码目前看起来像这样 note the msg string is a JSON message by the
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U

随机推荐

  • 使用 Visual Studio 2010 运行 64 位版本的 IIS Express 8 RC

    我有一个使用 64 位版本的网络应用程序SharpSvn 具有非托管依赖项的托管 DLL 它不能在 IIS Express 7 0 中运行 切换到 32 位版本的程序集效果很好 我安装的是64位版本IIS 8 RC 但是 Visual St
  • 为什么这不能在 Java 中编译?

    如果你给 public class test public static void main String ar if true int i 0 它没有编译 但带大括号的相同代码是 public class test public stat
  • 为笔记本设置默认 sys.path

    我将所有 py 文件放在文件夹 script 中 将所有 IPython 笔记本放在名为 Notebook 的文件夹下 每个笔记本文件对脚本上的一个或多个文件存在多个交叉依赖关系 Having sys path append在每个笔记本顶部
  • Sails.JS HTTP + HTTPS

    我正在尝试弄清楚如何提升一个同时响应 HTTP 和 HTTPS 请求的 sails 应用程序 我使用了 config local js 方法来配置express 如下 详细here var fs require fs module expo
  • 警报对话框中 EditText 框的空验证 - Android

    我正在尝试向位于警报对话框内的编辑文本字段添加一些文本验证 它提示用户输入名称 我想添加一些验证 这样如果他们输入的内容为空或为空 除了创建一个显示错误的 Toast 之外 它不会执行任何操作 到目前为止我有 AlertDialog Bui
  • IoC、Dll 引用和程序集扫描

    虽然这个问题与 StructureMap 有关 但我的一般问题是 使用 IoC 连接组件时 容器in code 相反 通过配置xml 你 通常需要明确的项目 构建 对所有程序集的引用 为什么要使用单独的组件 因为 抽象类驻留在 将组件与混凝
  • W/ViewRootImpl:由于没有窗口焦点而取消事件:MotionEvent?

    每次我从子活动按回父活动时都会收到此错误 W ViewRootImpl Cancelling event due to no window focus MotionEvent action ACTION CANCEL actionButto
  • 如何在 CouchDB 中使用 Map-Reduce 计算最大值?

    我知道有内置的 stats提供 sum count min max 和 sumsqr 的函数 我想知道的是如何以映射缩减方式计算最大值 如果没有更多信息 我无法想出一个可以工作的归约函数 我唯一能想到的就是对值进行排序并选取第一个值 我的地
  • 如何对单个 Neo4j 数据库进行分区?

    是否可以将一个 Neo4j 数据库进行划分 使一个数据库中有多个起点 从而可以隔离所有查询 而不是拥有多个数据库 我已经考虑过这一点 并且我认为它在一定程度上可以发挥作用 但是一旦使用了标签之类的东西 那么这个想法就行不通了 因为标签查询将
  • 在 jenkins 的 github pull request 中添加评论

    我在 Jenkins 中使用 Git 拉取请求构建器插件将拉取请求链接到 Jenkins 作业由钩子触发 一切运行顺利 尽管如此 在构建结束时 我想在出现失败 成功或错误时添加注释 我尝试使用管道并使用 pullRequest commen
  • AsyncUdpSocket如何使用接收

    我正在尝试让 iPhone 的程序在模拟器上运行 我的问题是接收 UDP 数据 我使用异步 Udp 套接字 如果我制作一个套接字并使用sendData NSData toHost 效果很好 我想我无法弄清楚接收功能是如何工作的 我假设是这样
  • MySQL、json、JSON_ARRAY_APPEND - 为什么追加在 5.7.13 上不起作用?

    我到底如何将数据插入 json mysql 字段 我可以创造一个记录 INSERT INTO git object user id git meta last update VALUES 11111 host a id 1 select n
  • instagram api 中的回调 url 是什么以及如何实现它

    嗨 我是初学者程序员 我正在尝试使用 Instagram 的实时照片更新 api 我的目的是使用这个API CONSOLE的订阅方法 https apigee com console instagram 但我无法理解和处理回调 url 回调
  • 具有离线路线功能的离线 iPhone 地图 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在开发一个 iPhon
  • 如何传递日期时间参数?

    如何将 UTC 日期传递给 Web API Passing 2010 01 01工作正常 但是当我传递 UTC 日期时 例如2014 12 31T22 00 00 000Z 带有时间部分 我收到 HTTP 404 响应 所以 http do
  • 防止 ASP.Net MVC 中的 Cookie 重放攻击

    我的任务是实现本文中的第 4 点 http support microsoft com kb 900111 这涉及使用会员资格提供程序在用户登录和注销时向服务器端记录添加注释 然后确认当使用 cookie 进行身份验证时 用户尚未注销 这对
  • 按字母顺序粘贴两个向量的元素

    假设我有两个向量 a lt c george harry harry chris steve steve steve harry b lt c harry steve chris harry harry george chris georg
  • 将 GNU 大小写范围扩展转换为标准 C

    GNU 大小写范围扩展允许 switch 语句中的大小写范围 switch value case 1 8 printf Hello 1 to 8 n break default printf Hello default n break 如何
  • 当您的类未定义 #each 时,返回 Enumerator::Lazy 的最佳方法是什么?

    Enumerable lazy依赖于你的枚举提供 each方法 如果你的枚举没有 each你不能使用的方法 lazy Now Kernel enum for and to enum提供指定枚举方法以外的灵活性 each Kernel enu
  • 使用 Delphi 6 处理 Unicode 字符

    我有一个用 Delphi 6 开发的轮询应用程序 它读取文件 根据规范解析文件 执行验证并上传到数据库 SQL Server 2008 精简版 我们必须为具有双字节字符集 DBCS 的操作系统提供支持 例如日本操作系统 因此 我们将 SQL