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

问题描述 投票:0回答:1

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

Firebird BLOB字段定义为:

BLOB SUB_TYPE 0 SEGMENT SIZE 80

TWideMemoField定义为:

object MainQryNOTES: TWideMemoField
  FieldName = 'NOTES'
  Origin = 'INVOICES.NOTES'
  ProviderFlags = [pfInUpdate]
  BlobType = ftWideMemo
end

测试字符串为“Цельпоинфляции,%”,其中可以从IBExpert软件中的BLOB字段读取:

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反转字节顺序,例如西里尔字符Ö具有HEX UTF8表示为04 26,但它存储在数据库中为26 04,类似的情况也与其他字符完全一致(可以在表https://www.w3schools.com/charsets/ref_utf_basic_latin.asphttps://www.w3schools.com/charsets/ref_utf_cyrillic.asp的帮助下检查这一点)。在我的情况下,我只有2字节的字符,但我想类似的情况也将是3字节和4字节的UTF8字符。

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

delphi unicode utf-8 firebird firebird-3.0
1个回答
3
投票

您的文本未编码为UTF8,它编码为UTF16。字符Ц是U+0426。按照惯例,16位代码单元以小端字节顺序存储,$ 26 $ 04。

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

© www.soinside.com 2019 - 2024. All rights reserved.