用户
 找回密码
 入住 CI 中国社区
搜索
查看: 9614|回复: 5
收起左侧

[修补 Patch] [1.5.4]解决CI的URL经encodeURI过的UTF-8中文编码问题

[复制链接]
发表于 2007-12-27 15:17:38 | 显示全部楼层 |阅读模式
第一次用CI开发项目,由于用到
  1. 热门搜索:素材
复制代码
这样的中文搜索功能,在URL处理上百思不得其解,在论坛上看到
  CI中的URL中是不是不可以出现中文?
这贴子,Hex回复说要修改$config['permitted_uri_chars'] 这个配置


偶在里添了处理中文的正则表达式\u4e00-\u9fa5
PHP复制代码
$config['permitted_uri_chars'] ='a-z 0-9~%.:_-\u4e00-\u9fa5';
复制代码

结果显示错误:
preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 18


google了一下把配置改成了
PHP复制代码
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-x00-xff';
复制代码

还是不出结果


实在无奈之下加了CI中文社区管理员Hex的QQ,在他的提示下,我试着修改
Router.php,
找到
PHP复制代码
if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
复制代码

这就是我们要修改的地方


百度查了一下,发现preg_match扩展正则表达式函数对utf-8中文支持并不是很友好
翻了翻PHP手册发现mb_ereg(Multibyte String Functions)、preg_match(POSIX 扩展正则表达式函数)、ereg(Perl 兼容正则表达式函数)这三类字符串处理函数区别,
Multibyte String Functions支持双字节字符串,
Perl 兼容正则表达式函数比POSIX 扩展正则表达式函数更快,
如果这样的话是否POSIX 扩展正则表达式函数就没必要使用了?
没想太多,赶快换成mb_ereg试试
PHP复制代码
if ( ! mb_ereg("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
复制代码
终于显示正常了

修改步骤:
1、./system/app/config/config.php找到$config['permitted_uri_chars'] 修改
成$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-x00-xff';
或$config['permitted_uri_chars'] ='a-z 0-9~%.:_\u4e00-\u9fa5';
或$config['permitted_uri_chars'] ='[\x01-\x7f]¦[\xc2-\xdf][\x80-\xbf]¦[\xe0-\xef][\x80-\xbf]{2} ¦[\xf0-\xff][\x80-\xbf]{3}';
2、./system/libraries/Router.php找到
PHP复制代码
if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
复制代码
修改成
PHP复制代码
if ( ! mb_ereg("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str))
复制代码

3、大功告成,现在的您的CI支持utf-8中文地址了
4、如果你的文件编码全是utf-8的在搜索结果页加上
$keyword = iconv("gb2312","utf-8",$this->uri->segment(3));

不明白的地方联系我:QQ:153214903

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

发表于 2007-12-27 15:44:29 | 显示全部楼层
感谢楼主!我给你修改了一下!你没有意见吧?呵呵
 楼主| 发表于 2007-12-27 15:46:33 | 显示全部楼层
没意见~~改得非常好
头像被屏蔽
发表于 2008-5-15 13:41:31 | 显示全部楼层
我试了一下,还是不行
发表于 2008-5-15 15:50:16 | 显示全部楼层
preg_quote
我觉得是这个函数的原因
他会把 \ 变成 \\
而中文匹配\x00-\xff会变成\\x00-\\xff
所以用preg_match是不能匹配

mb_ereg不大清楚,可能那样也行
发表于 2008-7-19 21:03:35 | 显示全部楼层
学习了........

本版积分规则