使用 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::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');
然后将类型放入Doctrine中换个新名字或者替换字符串类型:
<?php
\Doctrine\DBAL\Types\Type::addType('utf8string', 'Utf8StringType');
// replace the default string type
\Doctrine\DBAL\Types\Type::overrideType('string', 'Utf8StringType');
【讨论】:
以上是关于使用 Doctrine 2 强制编码和解码的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Symfony 2.0 AJAX 应用程序中将 Doctrine 实体编码为 JSON?
WebRTC 视频编解码类型的选择 VP8 H264 还是其他?(openh264编码,ffmpeg解码)