为什么Delphi IBX TWideMemoField转换UTF8字符串中的字节顺序,以及如何避免它?

为什么Delphi IBX TWideMemoField转换UTF8字符串中的字节顺序,以及如何避免它?,delphi,unicode,utf-8,firebird,firebird-3.0,Delphi,Unicode,Utf 8,Firebird,Firebird 3.0,我在Firebird 3数据库上使用带有IBX的Delphi 2009(我没有选择其他技术的选择,我必须适应这种情况)。我有以下定义: Firebird BLOB字段定义为: BLOB SUB_TYPE 0 SEGMENT SIZE 80 object MainQryNOTES: TWideMemoField FieldName = 'NOTES' Origin = 'INVOICES.NOTES' ProviderFlags = [pfInUpdate] BlobType =

我在Firebird 3数据库上使用带有IBX的Delphi 2009(我没有选择其他技术的选择,我必须适应这种情况)。我有以下定义:

Firebird BLOB字段定义为:

BLOB SUB_TYPE 0 SEGMENT SIZE 80
object MainQryNOTES: TWideMemoField
  FieldName = 'NOTES'
  Origin = 'INVOICES.NOTES'
  ProviderFlags = [pfInUpdate]
  BlobType = ftWideMemo
end
TWideMemoField的定义如下:

BLOB SUB_TYPE 0 SEGMENT SIZE 80
object MainQryNOTES: TWideMemoField
  FieldName = 'NOTES'
  Origin = 'INVOICES.NOTES'
  ProviderFlags = [pfInUpdate]
  BlobType = ftWideMemo
end
测试字符串为“ПццПццццццццццццццц109

26 04 35 04 3B 04 4C 04 20 00 3F 04 3E 04 20 00
38 04 3D 04 44 04 3B 04 4F 04 46 04 38 04 38 04
2C 00 20 00 25 00
奇怪的是,Delphi颠倒了字节顺序,例如西里尔字母字符θ的十六进制UTF8表示为04 26,但它存储在数据库中为26 04,其他字符的情况也与此完全相同(可以借助表和表进行检查)。在我的例子中,我只有2个字节的字符,但我想类似的情况也会出现在3和4个字节的UTF8字符上


那么-如何配置TWideMemoField以请求不转换UTF8字符串的字节顺序?

您的文本未编码为UTF8,而是编码为UTF16。角色是。按照惯例,16位代码单元以小尾端字节顺序存储,$26$04


换句话说,一切都按照预期和设计进行,我认为您没有必要尝试修复任何东西,因为没有任何东西损坏。

您的文本没有编码为UTF8,而是编码为UTF16。角色是。按照惯例,16位代码单元以小尾端字节顺序存储,$26$04


换句话说,一切都按预期和设计进行,我认为你没有必要尝试修复任何东西,因为没有任何东西损坏。

你为什么(实际上)再次问同样的问题,而不是编辑原始问题?Ref:在这个问题中,我试图了解如何以UTF8格式配置从TWideMemoField到数据库的保存,在这个问题中,我将试图了解如何在PHP中将UTF16LE转换为UTF8。试试sql.ru论坛,也许有人见过它。另外,也许你可以找到一个比d2009更新的IBX,这个BLOB字段是二进制的而不是文本的,所以我想知道Firebird是否会尝试转换它。如果有的话,您没有指定blob字段字符集/排序规则,也没有指定您设置的连接字符集。关于BLOB子类型:为什么你(实际上)再次问同样的问题,而不是编辑原始问题?Ref:在这个问题中,我试图了解如何以UTF8格式配置从TWideMemoField到数据库的保存,在这个问题中,我将试图了解如何在PHP中将UTF16LE转换为UTF8。试试sql.ru论坛,也许有人见过它。另外,也许你可以找到一个比d2009更新的IBX,这个BLOB字段是二进制的而不是文本的,所以我想知道Firebird是否会尝试转换它。如果有的话,您没有指定blob字段字符集/排序规则,也没有指定您设置的连接字符集。关于BLOB子类型:修复此问题的原因是Firebird本身不支持UTF-16,这意味着您需要将其作为二进制数据处理,而不能将数据库中的内容作为文本处理(也就是说,您无法正确使用某些内置数据库函数和运算符进行字符串操作)@MarkRotteveel那么你是说问题是使用了UTF-16,而不是字节顺序?未来的方法是确保使用了UTF-8?只有OP可以确定这一点,但我想说是的,UTF-16被持久化到数据库中这一事实是一个潜在的问题,OP可能想要解决这个问题,并确保UTF-8被存储。@MarkRotteveel,这将要求他动态更改字段类型,如果dependencia解决这一问题的原因是Firebird本身不支持UTF-16,这意味着您需要将其作为二进制数据处理,而不能将数据库中的内容作为文本处理(也就是说:您无法正确使用某些内置数据库函数和运算符进行字符串操作)@MarkRotteveel那么你是说问题是使用了UTF-16,而不是字节顺序?未来的方法是确保使用了UTF-8?只有OP可以确定这一点,但我想说是的,UTF-16被持久化到数据库中这一事实是一个潜在的问题,OP可能想要解决这个问题,并确保UTF-8被存储。@MarkRotteveel,这将要求他动态更改字段类型,如果依赖项