【问题标题】:Symfony2+Doctrine: How to convert iso8859-1 to utf-8 and viceversa?Symfony2+Doctrine:如何将 iso8859-1 转换为 utf-8,反之亦然?
【发布时间】:2015-03-04 13:12:32
【问题描述】:

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

有没有什么办法可以把从数据库接收到的数据全部转成utf8,把发送到DB的数据全部转成iso-8859-1,而不是把网站转成iso8859-1?也许使用 Doctrine 事件订阅者?如果是,我应该拦截哪些事件?

【问题讨论】:

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


    【解决方案1】:

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

    1. 定义自定义 DBAL 类型
    2. 在 boot Bundle 方法上初始化(我认为你也可以在 config.yml 中这样做)
    3. 将其用作实体字段的注释

    这是他的代码:

    DBAL 自定义类型

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

    希望对您有所帮助,也希望您能找到更好的解决方案!!!

    【讨论】:

    • 一个绝妙的主意!明天我会试试这个。非常感谢!
    猜你喜欢
    • 2010-09-27
    • 2012-05-16
    • 2017-08-23
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2021-06-10
    相关资源
    最近更新 更多