使用Delphi 6处理Unicode字符
我有一个在Delphi 6中开发的轮询应用程序.
它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 Express Edition) 我们必须为具有双字节字符集(DBCS)的操作系统提供支持,例如:日本OS. 轮询在使用DBCS的操作系统中工作正常.它也适用于非DBCS操作系统,如果 我进行了一些测试但未能确定解决方案. 例如如果我使用TStringList从UTF-8文件读取并将其保存到另一个文件,则保存Unicode数据. 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将导致 (请注意,您可以直接使用ADO Command.Parameters – 使用?chars作为参数的占位符而不是Delphi的约定:param_name). QuotedStr返回Ansi字符串.你需要这个功能的宽版本(TNT) 另外,As @Arioch’上面提到的 总之,你需要思考宽:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |