2016-08-14 75 views
0

我正在構建使用WIN1257(不是UTF8)編碼的Firebird 2.1數據庫的Yii2 REST應用程序。我能得到JSON的結果,如果數據不containt非拉丁字母,但是當VARCHAR字段包含非拉丁語言specifice字符,那麼我得到的錯誤消息:REST Yii2 - 如何在json中顯示來自數據庫的非UTF8字符?

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應用程序應該適應這種情況下的需求。

+0

如果您的數據庫爲所有(相關)列設置了明確的字符集,則可以使用連接字符集進行轉換。 –

回答

1

你能轉換你的字符串從WIN1257到UTF-8嗎?嘗試libiconv的:

$str = iconv("CP1257", "UTF-8", $str); 

可悲的是,在寫作的時候,mb_convert_encodingdoes not support 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作爲屬性。你的應用程序甚至不需要知道幕後的編碼。

+0

iconv正在工作,mb_convert_encoding不支持CP1257。這些函數必須從afterFind和beforeSave方法中調用,例如http://www.yiiframework.com/forum/index.php/topic/49296-using-csecuritymanager-to-encryptdecrypt-data/然後問題就解決了。 – TomR

+1

我想你說得對,mb_convert_encoding不支持CP1257。讓我更新我的答案。 – Beowulfenator

+1

使用'beforeSave'是一個壞主意 - 考慮如果您嘗試多次保存模型會發生什麼。使用一個getter/setter對。 – Beowulfenator

相關問題