代码之家  ›  专栏  ›  技术社区  ›  TomR

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

  •  0
  • TomR  · 技术社区  · 6 年前

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

    Firebird BLOB字段定义为:

    BLOB SUB_TYPE 0 SEGMENT SIZE 80
    

    Twidemmofield定义为:

    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颠倒了字节顺序,例如西里尔字符的十六进制UTF8表示法是04 26,但它存储在数据库中是26 04,其他字符的情况也完全相同(人们可以借助表格来检查这一点) https://www.w3schools.com/charsets/ref_utf_basic_latin.asp https://www.w3schools.com/charsets/ref_utf_cyrillic.asp

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   David Heffernan    6 年前

    您的文本没有编码为UTF8,而是编码为UTF16。角色是 U+0426

    换言之,一切都按预期和设计进行,我看不出你有必要尝试修复任何东西,因为没有任何东西是坏的。