【发布时间】:2013-01-10 03:42:59
【问题描述】:
我有一个用 Delphi 6 开发的轮询应用程序。 它读取文件,根据规范解析文件,执行验证并上传到数据库(SQL Server 2008 Express Edition)
我们必须为具有双字节字符集 (DBCS) 的操作系统提供支持,例如日本操作系统。 因此,我们将 SQL Server 中的数据库字段从 varchar 更改为 nvarchar。
轮询在带有 DBCS 的操作系统中运行良好。它也适用于非 DBCS 操作系统,如果 系统区域设置为日文/中文/韩文,操作系统具有相应的语言包。 但是,如果 Locale 设置为英语,则数据库包含双字节字符的垃圾字符。
我进行了一些测试,但未能确定解决方案。
例如如果我使用 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 操作系统中运行良好。
我尝试过使用字符串、宽字符串和 UTF8String。但是,如果语言环境设置为英语,这在英语操作系统中不起作用。
请提供有关此问题的任何指示。
【问题讨论】:
-
“D:\DelphiUnicode\unicode.txt”是什么意思?有很多 unicode 格式,例如 UTF-8、UTF-7 和少数 UTF-16 的变体尝试使用 TWideStringList 加载 UTF-16 文件。如果你的 Delphi 没有它 - 试试 Jedi CodeLibrary 中的 WideStringList
-
由于 Delphi 6 是相当旧的版本(除非应用了所有更新,否则存在相当多的错误),您是否考虑过迁移到 Delphi 或 Lazarus/CodeTyphoon 的一些现代版本?
-
其实你的代码很脆弱。阅读 SQL 注入并使用参数化查询。 bobby-tables.com 那也许还可以让你为参数指定 WideString 类型
-
@ArnaudBouchez RDBMS 被报告为一些“SQL Server”,可能是 Microsoft SQL Server 的某些版本
-
@Arioch'The :文件是 UTF-8。数据库是 SQL server express。这是测试应用程序,因此没有放置参数化查询。另外,我错过了一件事,如果我将 varchar 数据类型修改为 nvarchar,那么数据库插入就不是问题了。
标签: delphi unicode ado delphi-6 tadoquery