使用Delphi 6处理Unicode字符

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

我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如:日本OS.
因此,我们将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;

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

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

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

解决方法

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

忘记TADOQuery.sql(TStrings),并使用TADODataSet.CommandText或TADOCommand.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 – 使用?chars作为参数的占位符而不是Delphi的约定:param_name).

QuotedStr返回Ansi字符串.你需要这个功能的宽版本(TNT)

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

总之,你需要思考宽:)

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...