【问题标题】:Convert WideString to String将宽字符串转换为字符串
【发布时间】:2013-04-29 10:28:44
【问题描述】:

如何替换字符串中的空宽字符串?

例如: 'H e l l o' 转换为 'Hello'

我从数据库中读取了一个文本 blob 字段,并希望将其存储在另一个表中。当我阅读它时,我得到了多余的空格,当我存储它时,多余的空格仍然存在,并且在下一次查询时无法正确读取。

DXE、火鸟 2.5

更新
我使用 IBQuery -> DataSetProvider -> ClientDataSet 没有设计时创建的字段。 很明显,IBQuery 以错误的格式检索数据。

当前写入代码:

blobStream := TStringStream.Create;
...
blobStream.WriteString(blobText); //blobText = 'H e l l o';
ibsql.ParamByName('ABLOBCOL').LoadFromStream(blobStream);
...
ibsql.ExecQuery;
...

在FB数据库中存储的是'H e l l o',但它必须是'Hello'。由于这似乎是 IBQuery 中的一个错误,我需要一种方法来转换该字符串。

【问题讨论】:

  • 你问错问题了。您不想删除空格。您首先要正确解释数据。你能显示创建字符串的代码吗?
  • 更新了问题。

标签: delphi firebird delphi-xe


【解决方案1】:

首先,我不打算描述如何从字符串中删除所有其他字符。虽然这似乎可以解决您的问题,但它只是在裂开的裂缝上薄薄地覆盖。你这里有一个经典的文本编码不匹配。解决问题的真正方法是解决不匹配问题。

我怀疑问题出在您未显示的代码中。据我了解您现在的问题,您有一个 string 变量 blobText 包含错误编码的文本。但是问题中的代码将blobText 作为输入,因此当我们到达问题中的代码时,损坏已经造成。解决这个问题的关键是将duff数据放入blobText的代码。

您需要找到分配给blobText 的代码并在那里解决编码问题。看起来您已经采用 UTF-16 编码文本并将其解释为好像它具有 8 位编码。我可以推测这将如何发生,但您最好查看实际代码,即分配给blobText 的代码。如果您无法解决,请发布问题的更新。

我非常确信数据库中没有错误,这只是编码不匹配。

【讨论】:

  • 这没有帮助。现在,我只是更改了 TIBQuery 代码并将其包含到我的项目中。创建字段后,我现在总是返回 ftWideMemo 而不是 ftMemo。不确定该错误是否已在 Delphi XE 上修复?
  • 好吧,我仍然不知道您使用的是什么版本的 Delphi,以及您做了什么“没有帮助”。我怀疑除了您的代码之外的任何地方都存在错误。
  • 正如我的问题中提到的,我使用 DXE 和 Firebird 2.5。当使用 IBQuery 组件时,firbird 2.x 中的 Blob 文本始终被视为 DataType ftMemo。然后 TClientDataSet 及其 DataSetProvider 从 IBQuery 加载字段定义并将 ftMemo DataType 转换为 TMemoField。这导致了上面的问题描述。当 CDS 使用 TWideMemoField 时,值是正确的(没有空格 'H e l l o')。
  • 好吧,我没有把DXE变成Delphi版本。问题标签有帮助!
  • 也就是说,问题不在于写入数据,而在于从数据库读取数据。当数据被读取为'H e l l o'时,它已经是一个Unicode字符串,并且不能再转换,因为空格''被视为有效字符。
猜你喜欢
  • 2011-10-05
  • 2017-04-16
  • 1970-01-01
  • 2019-10-10
  • 2019-01-05
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多