加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用Delphi 6处理Unicode字符

发布时间:2020-12-15 09:30:04 所属栏目:大数据 来源:网络整理
导读:我有一个在Delphi 6中开发的轮询应用程序. 它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 Express Edition) 我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如:日本OS. 因此,我们将SQL Server中的数据库字段从varchar更改为
我有一个在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:DelphiUnicodeunicode.txt');
    //stlTemp.SaveToFile('D:DelphiUnicode1.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任务所需的所有控件和类.

总之,你需要思考宽:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读