首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >REST Yii2 -如何在json中显示来自数据库的非UTF8 8字符?

REST Yii2 -如何在json中显示来自数据库的非UTF8 8字符?
EN

Stack Overflow用户
提问于 2016-08-14 14:38:00
回答 1查看 3.7K关注 0票数 0

我正在构建Yii2 REST应用程序,该应用程序使用WIN1257 (而不是UTF8)编码的FireBird2.1数据库。如果数据不包含非拉丁字母,但是当varchar字段包含非拉丁语言特定字符时,我可以得到json结果,那么我会收到错误消息:

代码语言:javascript
复制
malformed UTF-8 characters, possibly incorrectly encoded., "yii\base\InvalidParamException"

完整的堆栈跟踪是:

代码语言:javascript
复制
{
  "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应用程序应该适应这种情况下的需求。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-14 16:54:09

你能把你的字符串从WIN1257转换成UTF-8吗?试试狮子座:

代码语言:javascript
复制
$str = iconv("CP1257", "UTF-8", $str);

可悲的是,在撰写本文的时候,mb_convert_encoding 不支持 CP1257。

我认为最好的解决方案是为属性创建一个getter/setter对。假设您的原始表列名为example_field。将下列方法添加到模型中:

代码语言:javascript
复制
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作为属性。您的应用程序甚至不需要知道幕后的编码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38943263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档