gpt4 book ai didi

delphi - 使用 Delphi 6 处理 Unicode 字符

转载 作者:行者123 更新时间:2023-12-03 15:10:17 35 4
gpt4 key购买 nike

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

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

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

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

例如如果我使用 TStringList 从 UTF-8 文件读取并将其保存到另一个文件,则 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 版本中,基础知识是您需要使用 WideString (Unicode) 而不是 String (Ansi)。

忘记TADOQuery.SQL (TStrings),并使用TADODataSet.CommandTextTADOCommand.CommandText(WideString)或类型转换TADOQuery 作为 TADODataSet。例如:

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 是 Ansi。如果 ParamCheck 为 true(默认情况下)TADOCommand.SetCommandText->AssignCommandText 将导致如果您的查询是 Unicode(InitParameters 是 Ansi),则会出现问题。

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

<小时/>

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

<小时/>

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

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

关于delphi - 使用 Delphi 6 处理 Unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14250491/

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