我正在构建Yii2 REST应用程序,该应用程序使用WIN1257 (而不是UTF8)编码的FireBird2.1数据库。如果数据不包含非拉丁字母,但是当varchar字段包含非拉丁语言特定字符时,我可以得到json结果,那么我会收到错误消息:
malformed UTF-8 characters, possibly incorrectly encoded., "yii\base\InvalidParamException"完整的堆栈跟踪是:
{
"name": "Exception",
"message": "Malformed UTF-8 characters, possibly incorrectly encoded.",
"code": 5,
"type": "yii\\base\\InvalidParamException",
"file": "C:\\xampp\\htdocs\\myproject\\vendor\\yiisoft\\yii2\\helpers\\BaseJson.php",
"line": 123,
"stack-trace": [
"#0 C:\\xampp\\htdocs\\myproject\\vendor\\yiisoft\\yii2\\helpers\\BaseJson.php(61): yii\\helpers\\BaseJson::handleJsonError(5)",
"#1 C:\\xampp\\htdocs\\myproject\\vendor\\yiisoft\\yii2\\web\\JsonResponseFormatter.php(89): yii\\helpers\\BaseJson::encode(Array, 320)",
"#2 C:\\xampp\\htdocs\\myproject\\vendor\\yiisoft\\yii2\\web\\JsonResponseFormatter.php(73): yii\\web\\JsonResponseFormatter->formatJson(Object(yii\\web\\Response))",
"#3 C:\\xampp\\htdocs\\myproject\\vendor\\yiisoft\\yii2\\web\\Response.php(948): yii\\web\\JsonResponseFormatter->format(Object(yii\\web\\Response))",
"#4 C:\\xampp\\htdocs\\myproject\\vendor\\yiisoft\\yii2\\web\\Response.php(312): yii\\web\\Response->prepare()",
"#5 C:\\xampp\\htdocs\\myproject\\vendor\\yiisoft\\yii2\\base\\Application.php(381): yii\\web\\Response->send()",
"#6 C:\\xampp\\htdocs\\myproject\\web\\index.php(12): yii\\base\\Application->run()",
"#7 {main}"
]
}在将这些字符呈现给json格式化程序之前,有可能派生出将这些字符转换为UTF8字符的类吗?数据库迁移到UTF8目前是遥不可及的,web应用程序应该适应这种情况下的需求。
发布于 2016-08-14 16:54:09
你能把你的字符串从WIN1257转换成UTF-8吗?试试狮子座:
$str = iconv("CP1257", "UTF-8", $str);可悲的是,在撰写本文的时候,mb_convert_encoding 不支持 CP1257。
我认为最好的解决方案是为属性创建一个getter/setter对。假设您的原始表列名为example_field。将下列方法添加到模型中:
public function getExampleField()
{
return iconv("CP1257", "UTF-8", $this->example_field);
}
public function setExampleField($value)
{
$this->example_field = iconv("UTF-8", "CP1257", $value);
}这样,您就可以透明地使用$model->exampleField作为属性。您的应用程序甚至不需要知道幕后的编码。
https://stackoverflow.com/questions/38943263
复制相似问题