关于unicode:为什么Delphi IBX TWideMemoField转换UTF8字符串中的字节顺序,如何避免呢?

Why Delphi IBX TWideMemoField converts byte order in UTF8 string and how to avoid it?

我在Firebird 3数据库上将Delphi 2009和IBX一起使用(我别无选择,只能适应其他情况)。我有以下定义:

Firebird BLOB字段定义为:

1
BLOB SUB_TYPE 0 SEGMENT SIZE 80

TWideMemoField定义为:

1
2
3
4
5
6
object MainQryNOTES: TWideMemoField
  FieldName = 'NOTES'
  Origin = 'INVOICES.NOTES'
  ProviderFlags = [pfInUpdate]
  BlobType = ftWideMemo
end

测试字符串为"Цельпоинфляции,%",并且可以从IBExpert软件的BLOB字段中读取它,如下所示:

1
2
3
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,其他字符也是如此(也可以通过表https://www.w3schools进行检查)。 com / charsets / ref_utf_basic_latin.asp和https://www.w3schools.com/charsets/ref_utf_cyrillic.asp)。就我而言,我只有2个字节的字符,但是我想类似的情况也将是3个字节和4个字节的UTF8字符。

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


您的文本未编码为UTF8,而是被编码为UTF16。字符?是U0426。按照约定,16位代码单元以小尾数字节顺序存储,即$ 26 $ 04。

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