我们必须支持具有双字节字符集(DBCS)的操作系统,例如日本操作系统。因此,我们将SQL Server中的数据库字段从varchar更改为nvarchar。
在具有DBCS的操作系统中,轮询可以正常工作。如果系统区域设置设置为日语/中文/韩语且操作系统具有相应的语言包,则非DBCS操作系统也可以成功运行。 但是,如果区域设置设置为英语,则双字节字符会显示为垃圾字符。
我进行了一些测试,但未能找到解决方案。
例如,如果我使用TStringList从UTF-8文件中读取并保存到另一个文件,则Unicode数据将被保存。但是,如果我使用文件内容运行TADOQuery组件的更新查询,则会显示垃圾字符。数据库中也包含垃圾字符。
以下是示例代码:
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;
以上代码在双字节字符集操作系统中运行良好。
我已尝试使用string、widestring和UTF8String进行调整。但是,在英文操作系统上,如果区域设置为英语,则无法正常工作。
请提供有关此问题的任何指针。