Symfony2+Doctrine: 如何将 iso8859-1 转换为 utf-8,反之亦然?

3
我们正在构建一个使用Oracle数据库的Symfony2应用程序。数据库中的所有数据均编码为WE8ISO8859P15(iso-8859-1),而整个网站则使用utf-8进行编码。
有没有办法将从数据库接收到的所有数据都转换为utf8,并将发送到数据库的所有数据都转换为iso-8859-1,而不是将网站转换为iso8859-1?也许可以使用Doctrine事件订阅器完成这个操作?如果是这样,我应该拦截哪些事件?
1个回答

6

我曾经处理过一个类似的问题,需要将MSSQL实例从utf8转换为latin1或者反过来。我采用了以下步骤:

  1. 定义一个自定义的DBAL类型
  2. 在启动Bundle方法中进行初始化(我认为也可以在config.yml中进行)
  3. 在实体字段上使用它作为注释

以下是代码:

DBAL CUSTOM TYPE

<?php
namespace Acme\DemoBundle\Doctrine\Type;

use Doctrine\DBAL\Types\StringType;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class Utf8String 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

namespace Acme\DemoBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Doctrine\DBAL\Types\Type;

class AcmeDemoBundle extends Bundle
{
    public function boot() {

        if (!Type::hasType('utf8string'))
        {
            Type::addType('utf8string', 'Acme\DemoBundle\Doctrine\Type\Utf8String');

            $em = $this->container->get('doctrine.orm.em_my_sqlserver_entity_manager');
            $conn = $em->getConnection();
            $conn->getDatabasePlatform()->registerDoctrineTypeMapping('Utf8String', 'utf8string');
        }
    }

}

一个映射实体的示例

<?php

namespace Acme\DemoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 *
 * @ORM\Table(name="VEHICLE")
 * @ORM\Entity()
 */
class Vehicle
{

    /**
     * @ORM\Id
     * @ORM\Column(name="VEHICLE_NAME", type="utf8string", length=16, nullable=false)
     */
    private $name;


    /**
     * @var integer
     *
     * @ORM\Column(name="ID_VEHICLE", type="integer", nullable=true)
     */
    private $idVehicle;

....
}

希望这能够帮到你,并且希望你也能找到更好的解决方案!

一个绝妙的想法!明天我会尝试一下。非常感谢! - mHouses

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接