在 Yii 2.0 中报错:Malformed UTF-8 characters, possibly incorrectly encoded. 的排查分析
1、在 Yii 2.0 中报错:Malformed UTF-8 characters, possibly incorrectly encoded.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "name": "Exception", "message": "Malformed UTF-8 characters, possibly incorrectly encoded.", "code": 5, "type": "yii\\base\\InvalidArgumentException", "file": "E:\\wwwroot\\pcs-api-feature-base-3.0\\vendor\\yiisoft\\yii2\\helpers\\BaseJson.php", "line": 133, "stack-trace": [ "#0 E:\\wwwroot\\pcs-api-feature-base-3.0\\vendor\\yiisoft\\yii2\\helpers\\BaseJson.php(67): yii\\helpers\\BaseJson::handleJsonError(5)", "#1 E:\\wwwroot\\pcs-api-feature-base-3.0\\vendor\\yiisoft\\yii2\\web\\JsonResponseFormatter.php(119): yii\\helpers\\BaseJson::encode('SQLSTATE[HY000]...', 320)", "#2 E:\\wwwroot\\pcs-api-feature-base-3.0\\vendor\\yiisoft\\yii2\\web\\JsonResponseFormatter.php(104): yii\\web\\JsonResponseFormatter->formatJson(Object(yii\\web\\Response))", "#3 E:\\wwwroot\\pcs-api-feature-base-3.0\\vendor\\yiisoft\\yii2\\web\\Response.php(1070): yii\\web\\JsonResponseFormatter->format(Object(yii\\web\\Response))", "#4 E:\\wwwroot\\pcs-api-feature-base-3.0\\vendor\\yiisoft\\yii2\\web\\Response.php(337): yii\\web\\Response->prepare()", "#5 E:\\wwwroot\\pcs-api-feature-base-3.0\\vendor\\yiisoft\\yii2\\base\\Application.php(392): yii\\web\\Response->send()", "#6 E:\\wwwroot\\pcs-api-feature-base-3.0\\api\\web\\index.php(17): yii\\base\\Application->run()", "#7 {main}" ] } |
2、查看代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php namespace api\rests\check_status; use Yii; use yii\web\HttpException; use yii\base\Exception; use yii\data\ActiveDataProvider; use yii\data\DataFilter; class IndexAction extends \yii\rest\IndexAction { /** * @return int|string|ActiveDataProvider|DataFilter|null */ public function run() { try { Yii:: $app ->db->open(); if (!Yii:: $app ->redis->ping()){ throw new HttpException(500, 'Redis is unavailable.' ); } elseif (!Yii:: $app ->db->getIsActive()){ throw new HttpException(500, 'Database is unavailable.' ); } else { return 200; } } catch (Exception $e ) { $res = Yii:: $app ->response; $res ->statusCode = 500; return $e ->getMessage(); } } } |
3、打印输出 $e->getMessage(),其中包含乱码。如图1
1 | SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: ��֪�������������� |
4、编辑代码,mb_convert_encoding — 转换字符的编码。响应状态码为:500,响应体为:”SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: 不知道这样的主机。 “。如图2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php namespace api\rests\check_status; use Yii; use yii\web\HttpException; use yii\base\Exception; use yii\data\ActiveDataProvider; use yii\data\DataFilter; class IndexAction extends \yii\rest\IndexAction { /** * @return array|false|int|string|string[]|ActiveDataProvider|DataFilter|null */ public function run() { try { Yii:: $app ->db->open(); if (!Yii:: $app ->redis->ping()){ throw new HttpException(500, 'Redis is unavailable.' ); } elseif (!Yii:: $app ->db->getIsActive()){ throw new HttpException(500, 'Database is unavailable.' ); } else { return 200; } } catch (Exception $e ) { Yii:: $app ->response->statusCode = 500; $message = mb_convert_encoding( $e ->getMessage(), "UTF-8" , [ "UTF-8" , "GBK" , "GB2312" , "BIG5" ]); return $message ; } } } |
5、初步推测,不知道这样的主机是由 Windows 10 系统返回的。与是否是中文无甚关系,而是与中文本身的编码存在关系。因为 message 为:”Failed to open redis DB connection (tcp://localhost:63799, database=57): 10061 – 由于目标计算机积极拒绝,无法连接。\r\n” 时,未转换字符的编码也是可以正常运行的。
近期评论