thinkphp里url参数值有中文,如http://taotaoit.com/web/白.html,怎么也获得不到参数值。
刚开始以为是thinkphp路由规则有问题,查了很久也没解决。
后来以为,汉字转换成了UrlEncode编码,然后就用UrlDecode解码,还是不行。
I("webColor")就没有接收到值。
继续查找发现,I方法好像是存在bug,接受不到值,于是改$_GET["webColor"]接收,有值但是乱码,所以用iconv转码,然后就正常接收参数了。代码如下:
$webColor = iconv("gb2312","utf-8",$_GET["webColor"]); //从gb2312编码转为utf-8编码
20190510
后台搜索汉字也出现同样的情况,而且更复杂。
情况说明:
1,第一次点查询按钮搜索,传递参数方式是post,参数编码是utf-8;点击翻页,传递参数方式是get,不知道为什么参数编码变成了gb2312;
2,接收的参数需要在sql语句中进行模糊查询,还需要通过控制器返回到视图中显示;
解决方案:
I()函数,可以接收utf-8编码的参数,接收gb2312编码的参数出错,所以直接用$_REQUEST接收参数,包含post,get两种方式。然后判断参数的编码类型,不是utf-8编码的参数,转成utf-8编码。由于翻页时,传递的参数是用I()传递的,I()接收的参数是个一维数组,所以把数组中涉及汉字的查询参数,替换成转码后的参数,再传递给分页函数就可以了。
具体解决如下:
ArticlesModel.class.php修改的代码
$articleTitle = $_REQUEST["articleTitle"]; // 第一次点查询的时候,传递参数是post,之后点分页的时候是get,所以单独用$_POST和$_GET都不行,I()接收不到url编码的汉字,所以只能用$_REQUEST
if($articleTitle != ''){
// echo '1:' . $articleTitle . '
';
$encode = mb_detect_encoding($articleTitle, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5')); // 判断接收到的字符串编码
if ($encode != 'UTF-8'){
// 如果不是UTF-8编码,则转成UTF-8编码(针对之后的分页),如果是,继续执行(针对第一次查询)
$articleTitle = iconv("gb2312",'UTF-8',$articleTitle); // gb2312转成UTF-8编码
// echo '2:' . $articleTitle . '
';
}
}
// echo $encode; // EUC-CN 是gb2312编码的一种表示方法
$articleContent = $_REQUEST["articleContent"];
if($articleContent != ''){
$encode = mb_detect_encoding($articleContent, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
if ($encode != 'UTF-8'){
$articleContent = iconv("gb2312",'UTF-8',$articleContent); // gb2312转成UTF-8编码
}
}
ArticlesAction.class.php修改的代码:
$canshu = I(); // 翻页是用到的参数,如果articleTitle和articleContent不为空的话,则把它们替换成转码之后的值,这样翻页就不会丢失参数了
$articleTitle = $_REQUEST["articleTitle"];
if($articleTitle != ''){
$encode = mb_detect_encoding($articleTitle, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
if ($encode != 'UTF-8'){
$articleTitle = iconv("gb2312",'UTF-8',$articleTitle);
}
$canshu['articleTitle'] = $articleTitle;
}
$this->assign('articleTitle',$articleTitle);
$articleContent = $_REQUEST["articleContent"];
if($articleContent != ''){
$encode = mb_detect_encoding($articleContent, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
if ($encode != 'UTF-8'){
$articleContent = iconv("gb2312",'UTF-8',$articleContent); // gb2312转成UTF-8编码
}
$canshu['articleContent'] = $articleContent;
}
$this->assign('articleContent',$articleContent);
$pager = new \Think\Page($page['total'],$page['pageSize'],$canshu);// 实例化分页类
20191114
汉字“小”“写”上述方法不管用,不知道为什么