我正在构建使用WIN1257(不是UTF8)编码的Firebird 2.1数据库的Yii2 REST应用程序。如果数据不包含非拉丁字母,但是当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应用程序应适应要求。
您可以将字符串从WIN1257转换为UTF-8吗?尝试libiconv:
$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
用作属性。您的应用程序甚至不需要了解幕后的编码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句