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

时间:2015-03-04 13:12:32

标签: php symfony encoding utf-8 doctrine-orm

我们正在构建一个使用Oracle数据库的Symfony2应用程序。数据库中的所有数据都编码为WE8ISO8859P15(iso-8859-1),所有网站编码为utf-8。

有没有办法将从数据库收到的所有数据转换为utf8,并将发送到数据库的所有数据转换为iso-8859-1,而不是将网站转换为iso8859-1?也许使用Doctrine事件订阅者?如果是这样,我应该拦截哪些事件?

2 个答案:

答案 0 :(得分:4)

我用MSSQL实例解决了类似的问题,从utf8转换为latin1,反之亦然。我执行以下步骤:

  1. 定义自定义DBAL类型
  2. 初始化引导Bundle方法(我认为你也可以在config.yml中进行)
  3. 将其用作实体字段的注释
  4. 这是他的代码:

    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');
        }
    }
    

    BUNDLE INITIALISATION

    <?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;
    
    ....
    }
    

    希望得到这个帮助,希望你能找到更好的解决方案!!!

答案 1 :(得分:0)

您可以在oracle中设置与config.yml数据库的连接编码。在您的情况下,您应该将连接编码设置为UTF-8,而Oracle应该处理UTF-8(网站)和iso-8859-1(db)编码之间的所有转换。因此,将此配置放在config.yml中就足够了:

doctrine:
    dbal:
        default_connection: oracle
        connections:
            oracle:
                driver:   %ora_database_driver%
                host:     %ora_database_host%
                port:     %ora_database_port%
                dbname:   %ora_database_name%
                user:     %ora_database_user%
                password: %ora_database_password%
                charset:  UTF8