Yii2-从Firebird 3.x数据库(来自Delphi IBX TWideMemoField)反应UTF8字符串的奇怪表示吗?

时间:2018-09-02 16:21:36

标签: php reactjs delphi utf-8 yii2

我有Firebird 3.x数据库,数据库字符集名称为UTF8,并且数据库中的BLOB字段定义为:

<classes>
<class name="Login">

    <methods>
                <include name="OpenBrowser"></include>
                <parameter name="browsername" value="chrome"></parameter>
                <include name="EnterURL"></include>
                <parameter name="URL" value="https://www.ebay.com/"></parameter>

    </methods>
</class>
</classes>

我正在使用具有相关参数和ActiveRecord字段标准访问权限的Firebird-Yii2连接器https://github.com/edgardmessias/yii2-firebird。俄语文本“Цельпоинфляции,%”存储在十六进制数据库中,为

BLOB SUB_TYPE 0 SEGMENT SIZE 80

PHP函数的结果是

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

React组件中的输出更加陌生-太奇怪了,甚至SO也无法超越字符,因此我必须在此处粘贴图片:

enter image description here

那么-我如何存储和显示数据怎么了?这是什么编码?我可以将当​​前格式保留在数据库中更好(因为它已针对其他非Yii2 Delphi Unicode系统进行了微调),并且可以更好地调整Yii2(更好)或React(差一点)参数的方式可能更好。该BLOB字段是在数据库中读写的。我只有BLOB字段有这个问题,varchar字段得到了很好的处理。

Firebird数据库中的数据是从Delphi程序(使用IBX组件和TWideMemoField)保存的。 奇怪的是,Delphi会反转字节顺序,这是我所处情况的本质,例如西里尔字母"notes":"&\u00045\u0004;\u0004L\u0004 \u0000?\u0004>\u0004 \u00008\u0004=\u0004D\u0004;\u0004O\u0004F\u00048\u00048\u0004,\u0000 \u0000%\u0000" 的十六进制UTF8表示为Ц,但它以04 26的形式存储在数据库中,并以26 04的形式从PHP读取(例如,可以使用表{{ 3}}和https://www.w3schools.com/charsets/ref_utf_basic_latin.asp)。

所以-可以有两种解决方案:

  • 以某种正确的字节顺序正确地纠正了Delphi IBX TWideMemoField如何将UTF数据存储到BLOB字段中
  • 以某种方式在PHP代码中从一种字节序转换为另一种字节序。尽管这很奇怪,因为UTF8没有字节序的概念。根据{{​​3}},UTF8是面向字节的,而不是面向字的编码,因此,对于UTF8,存在字节序的概念)

0 个答案:

没有答案