pp18180058 发表于 2007-12-27 15:17:38

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

第一次用CI开发项目,由于用到热门搜索:素材这样的中文搜索功能,在URL处理上百思不得其解,在论坛上看到
CI中的URL中是不是不可以出现中文?
这贴子,Hex回复说要修改$config['permitted_uri_chars'] 这个配置


偶在里添了处理中文的正则表达式\u4e00-\u9fa5
$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了一下把配置改成了
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-x00-xff';
还是不出结果


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

Hex 发表于 2007-12-27 15:44:29

感谢楼主!我给你修改了一下!你没有意见吧?呵呵

pp18180058 发表于 2007-12-27 15:46:33

没意见~~改得非常好

ackiae86 发表于 2008-5-15 13:41:31

我试了一下,还是不行

kkito 发表于 2008-5-15 15:50:16

preg_quote
我觉得是这个函数的原因
他会把 \ 变成 \\
而中文匹配\x00-\xff会变成\\x00-\\xff
所以用preg_match是不能匹配

mb_ereg不大清楚,可能那样也行

ambo 发表于 2008-7-19 21:03:35

学习了........
页: [1]
查看完整版本: [1.5.4]解决CI的URL经encodeURI过的UTF-8中文编码问题