使用 Doctrine 2 强制编码和解码

Posted

技术标签:

【中文标题】使用 Doctrine 2 强制编码和解码【英文标题】:Forcing encoding & decoding with Doctrine 2 【发布时间】:2013-10-01 09:14:41 【问题描述】:

我正在使用旧版 big ball of mud,它使用 latin1 数据库,但使用 utf8 字符串。每次应用程序读取或写入数据库时​​,它都会手动解码或编码,并将utf8 编码的字符串存储在latin1 数据库中。

写入时,它会执行以下操作:

$value = utf8_encode("Iñtërnâtiônàlizætiøn")
mysql_query("INSERT INTO table (key) VALUES ($value)")

所以存储的值为Iñtërnâtiônà lizætiøn

阅读时:

$result = mysql_query("SELECT key FROM table")
$value = utf8_decode($result) // Wich results on "Iñtërnâtiônàlizætiøn" again

如何使用 Doctrine 2 管理同一个数据库并尊重这种奇怪的行为?

以下代码在我的Entity 中使用时将按预期工作,但我正在寻找更清洁和干燥的解决方案。

public function setKey($value)

    $this->key = utf8_encode($value);


public function getKey()

    return utf8_decode($this->key);

【问题讨论】:

【参考方案1】:

您可以创建自己的自定义“字符串”类型并覆盖Doctrine\DBAL\Types\Type 中的类。 Type::convertToDatabaseValueType::convertTophpValue 将是您想要覆盖的内容。

<?php
use Doctrine\DBAL\Types\StringType;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class Utf8StringType extends StringType

    /**
     * @inheritdoc
     */
    public function convertToDatabaseValue($value, AbstractPlatform $p)
    
        // convert from utf8 to latin1
        return mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
    

    /**
     * @inheritdoc
     */
    public function convertToPHPValue($value, AbstractPlatform $p)
    
        // convert from latin1 to utf8
        return mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1');
    

然后将类型放入Doctrine中换个新名字或者替换字符串类型:

<?php
\Doctrine\DBAL\Types\Type::addType('utf8string', 'Utf8StringType');
// replace the default string type
\Doctrine\DBAL\Types\Type::overrideType('string', 'Utf8StringType');

【讨论】:

以上是关于使用 Doctrine 2 强制编码和解码的主要内容,如果未能解决你的问题,请参考以下文章

如何测试使用教师强制训练的模型

有没有办法使用doctrine2强制执行唯一列?

如何在 Symfony 2.0 AJAX 应用程序中将 Doctrine 实体编码为 JSON?

WebRTC 视频编解码类型的选择 VP8 H264 还是其他?(openh264编码,ffmpeg解码)

WebRTC 视频编解码类型的选择 VP8 H264 还是其他?(openh264编码,ffmpeg解码)

base 64 以角度编码和解码字符串 (2+)