Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将宽字符串转换为字符串_Delphi_Firebird_Delphi Xe - Fatal编程技术网

Delphi 将宽字符串转换为字符串

Delphi 将宽字符串转换为字符串,delphi,firebird,delphi-xe,Delphi,Firebird,Delphi Xe,如何替换字符串中的空宽字符串字符 e、 g: “Hello”转换为“Hello” 我从数据库中读取了一个文本blob字段,并希望将其存储在另一个表中。当我读取它时,我会得到额外的空间,当我存储它时,额外的空间会保留下来,并且在下一次查询时无法正确读取 火鸟2.5 更新: 我使用IBQuery->DataSetProvider->ClientDataSet,而不使用desin time创建的字段。 事实上,IBQuery检索的数据格式是错误的 当前写入代码: blobStream := TStri

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

e、 g: “Hello”转换为“Hello”

我从数据库中读取了一个文本blob字段,并希望将其存储在另一个表中。当我读取它时,我会得到额外的空间,当我存储它时,额外的空间会保留下来,并且在下一次查询时无法正确读取

火鸟2.5

更新
我使用IBQuery->DataSetProvider->ClientDataSet,而不使用desin time创建的字段。 事实上,IBQuery检索的数据格式是错误的

当前写入代码:

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

FB数据库中存储了“HE l o”,但必须是“Hello”。因为这似乎是IBQuery中的一个bug,所以我需要一种转换该字符串的方法。

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

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

您需要找到分配给
blobText
的代码,并解决那里的编码问题。看起来您已经获取了UTF-16编码文本,并将其解释为8位编码。我可以推测这是如何发生的,但您最好看看实际的代码,即分配给
blobText
的代码。如果你不能解决这个问题,请发布问题的更新


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

你问错了问题。您不想删除空格。首先要正确解释数据。你能显示创建字符串的代码吗?更新了问题。这没有帮助。现在,我只是更改了TIBQuery代码并将其包含到我的项目中。创建字段时,我总是返回ftWideMemo,而不是现在返回ftMemo。不确定这个bug是否已经在Delphi XE上修复了?好吧,我仍然不知道你使用的是什么版本的Delphi,以及你做了什么“没有帮助”。我怀疑除了你的代码之外,任何地方都有bug。正如我在问题中提到的,我使用DXE和Firebird 2.5。当使用IBQuery组件时,firbird 2.x中的Blob文本始终作为数据类型ftMemo处理。然后TClientDataSet及其DataSetProvider从IBQuery加载字段定义,并将ftMemo数据类型转换为TMemoField。这导致了上面描述的问题。当CD使用TWideMemoField时,则值是正确的(没有空格'HE l o')。好的,我没有将DXE转换为Delphi版本。问号帮助!这意味着,问题不在于写入数据,而在于从数据库读取数据。当数据以“HE l o”的方式读取时,它已经是一个Unicode字符串,并且无法再进行转换,因为空格“”被当作有效字符处理。