使用Delphi 6处理Unicode字符

Abh*_*eet 5 delphi unicode ado tadoquery delphi-6

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

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

轮询在使用DBCS的操作系统中工作正常.如果系统区域设置设置为日语/中文/韩语且操作系统具有相应的语言包,则它也可以成功用于非DBCS操作系统.但是,如果Locale设置为english,则数据库包含双字节字符的垃圾字符.

我进行了一些测试但未能确定解决方案.

例如,如果我使用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;
Run Code Online (Sandbox Code Playgroud)

以上代码在DBCS操作系统中正常工作.

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

请提供此问题的任何指示.

kob*_*bik 4

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

忘记TADOQuery.SQL(TStrings),并使用TADODataSet.CommandTextor TADOCommand.CommandText(WideString) 或类型转换TADOQueryTADODataSet. 例如:

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

TADODataSet(qry).CommandText := stQuery;
RowsAffected := qry.ExecSQL;
Run Code Online (Sandbox Code Playgroud)

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


对参数化查询要格外小心:ADODB.TParameters.ParseSQL是 Ansi。如果ParamCheck为 true(默认情况下)TADOCommand.SetCommandText->AssignCommandText如果您的查询是 Unicode(InitParameters是 Ansi),则会导致问题。

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


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


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

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