Utf 8 强制编码&;用条令2解码

Utf 8 强制编码&;用条令2解码,utf-8,character-encoding,doctrine-orm,latin1,Utf 8,Character Encoding,Doctrine Orm,Latin1,我使用的是一个使用latin1数据库但使用utf8字符串的遗留数据库。每次应用程序读取或写入数据库时,都会手动解码或编码,并将utf8编码字符串存储在latin1数据库中 在写作时,它会执行以下操作: $value=utf8_编码(“Iñtërn–tiênálizêtiên”) mysql_查询(“插入表(键)值($value)”) 因此,存储值为IñtërnÃ、tiônÃlizÃtiÃ184; n 阅读时: $result=mysql\u查询(“从表中选择键”) $value=utf8

我使用的是一个使用
latin1
数据库但使用
utf8
字符串的遗留数据库。每次应用程序读取或写入数据库时,都会手动解码或编码,并将
utf8
编码字符串存储在
latin1
数据库中

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

$value=utf8_编码(“Iñtërn–tiênálizêtiên”)
mysql_查询(“插入表(键)值($value)”)
因此,存储值为
IñtërnÃ、tiônÃlizÃtiÃ184; n

阅读时:

$result=mysql\u查询(“从表中选择键”)
$value=utf8_decode($result)//再次显示“Iñtërn–tiënálizëtiên”的结果
我如何使用原则2管理同一个数据库,并尊重这种奇怪的行为

以下代码在我的
实体中使用时将按预期工作,但我正在寻找一种更干净、干燥的解决方案

public function setKey($value)
{
    $this->key = utf8_encode($value);
}

public function getKey()
{
    return utf8_decode($this->key);
}

您可以创建自己的自定义“字符串”类型,并在
原则\DBAL\Types\type
中重写它的类
Type::convertToDatabaseValue
Type::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');
    }
}

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