簡體   English   中英

REST Yii2-如何在JSON中顯示來自數據庫的非UTF8字符?

[英]REST Yii2 - how to display non-UTF8 characters coming from database in json?

我正在構建使用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用作屬性。 您的應用程序甚至不需要了解幕后的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM