让CI支持中文传参的更简易的三种方法
本帖最后由 longjianghu 于 2010-4-14 11:14 编辑在项目应用中有时会用到中文参数,CI会进行安全性过滤,所以通常比较麻烦,论坛上有一个解决方法,改的地方还是比较多,地址是:http://codeigniter.org.cn/forums/viewthread.php?tid=1382,如果我只是临时用一下,改这么多内容比较麻烦。
比如下面的示例:
http://www.domain.com/index.php/app/show/小王,在这里我想将小王以参数传到show方法里面处理。通常情况下我们会向下面这样写:
$this->load->helper('url');
echo anchor('app/show/小王','链接');
由于CI安全性过滤的原因,中文肯定通不过验证直接提示:
The URI you submitted has disallowed characters。
下面我自己写了一个扩展,你可以直接把下面的代码另存为MY_URI.php存放到你项目中的libraries目录下。代码如下:
<?php
class MY_URI extends CI_URI {
function _explode_segments()
{
foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
{
// Filter segments for security
$val = trim($this->_filter_uri(rawurlencode($val))); if ($val != '')
{
$this->segments[] = rawurldecode($val);
}
}
}
}
?>
当CI获取参数的时候我使用rawurlencode加密我们传过去的中文参数,_filter_uri用正则过滤,明显我们传过去是参数是有效的,下面给$this->segments数组赋值的时候我在用rawurldecode解密,这样我就可以直接使用了。
也许有人会问为什么不使用urlencode,这里我要告诉你的是,urlencode也可以使用,但是如果中文参数有空格,该函数会把空格编码成加号,但加号就通不过_filter_uri函数的验证了(config.php文件里$config['permitted_uri_chars'] 中不允许加号)。
个人觉得我这个方法比上面提到的方法简便一点,不用更改哪么多设置,如有错误欢迎指正!
如果你是临时用一下你可以直接使用rawurlencode,不过我发现要写两次。比如这样:rawurlencode(rawurlencode('你的参数'));至于为什么要写两次我还正在研究,当然解密的时候也需要解两次。如果你使用smarty传参,你可以使用smarty的escape方法,像这样:{$user.user_name|escape:"url"|escape:"url"}。
这样就可以顺利传参了,为什么要写两次,哪里因为CI在input类中解密了一次。~~ 额是菜鸟 为什么直接在library里放入这个文件就可以?它怎么调用的啊??? 额是菜鸟 为什么直接在library里放入这个文件就可以?它怎么调用的啊??? ...
libintc123 发表于 2010-4-19 15:20 http://codeigniter.org.cn/forums/images/common/back.gif
这个你就要看 CI 源码了,CI 是有一个机制自动调用的。 额是另一头菜鸟……额一直是酱紫用的。不需要加文件。
因为我的uri参数是一段,自己处理。参见 31103.cn
config/config.php
//$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
$config['permitted_uri_chars'] = '';
回复 4# bigfat
你这样做是比较危险的,CI就不会对参数进行过滤了。 谢了哦 解决我大问题了 狂顶 本帖最后由 dllhb 于 2010-8-3 17:05 编辑
我使用你的方法为什么传入‘大连’显示:澶ц繛,我的网页头:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN "
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="utf-8"> 回复 8# dllhb
编码问题 本帖最后由 feiying0193 于 2011-3-16 22:02 编辑
把中文先编码再传,接收后再解码不行吗?
//编码
$string = base64_encode('小明');
anchor('welcome/index/'.$string,'链接');
//welcome.php
function index($string){
echo base64_decode($string);//解码
}
页:
[1]
2