Delphi Unicode字符串不匹配

时间:2013-07-30 23:18:07

标签: delphi unicode firebird paradox unidac

我有一个使用Paradox数据库通过BDE的Delphi 7应用程序,我已经转换为Delphi XE3和Firebird。 Paradox数据库中有一个字符串字段,其中包含一个加密字符串,该字符串据称用于许可软件。问题是虽然在旧程序(D7 / Paradox)中读取此字符串的例程工作正常,但在新程序(XE3 / Firebird)中,例程正在抛出错误。我通过调试找到的原因是从数据库读取后的字符串是不同的。我该如何解决这个问题?

旧Paradox数据库中的字符串:

  

伍-DrLrDOtfâtD89D1'D'îu

新Firebird数据库中的字符串:

  

伍-DrLrDOtfâtD89D1'D'îu

如上所示,两个数据库中的字符串相同。

在新的Delphi XE3程序中,当我尝试使用FieldByName('fieldname')获取字段的值时使用UniDAC数据访问组件.AsString,这是返回的内容:

  

伍-DrLrDOtfâtD89D1'D'îu

你可以看到几个字符是不同的。这导致在程序中检查此字符串的例程中出错。你以前经历过这个吗?导致此问题的可能原因是什么?我可以采取哪些步骤来解决此问题。

注1:我使用Delphi编写的转换器将Paradox数据库转换为Firebird(有关此转换器的实际代码,请参阅:http://goo.gl/6xu2ST

注2:我使用DEFAULT CHARACTER SET UTF8创建数据库,UniDAC连接组件(TUniConnection)将SpecificOptions CharSet设置为'UTF8'。

1 个答案:

答案 0 :(得分:2)

我通过以下方式解决了问题:

  1. 在数据模块或代码中,将TUniConnection组件属性SpecificOptions UseUnicode设置为True。

  2. 关闭项目和Delphi IDE。打开WinGrep并在所有项目PAS和DFM文件中为字符串执行Find-Replace:TStringField,将其更改为TWideStringField。

  3. 重新编译。

  4. 瞧,它的工作完美!由于数据库中Unicode字符的翻译/解释不完整而导致运行时出错。

    感谢所有早些回复的人。