CodeIgniter 完美解决URL含有中文字符串


Posted in PHP onMay 13, 2016

codeIgniter默认的配置下是不允许URL中包含非ASCII字符的,如果URL中含非ASCII字符,那么CI会毫不客气的抛出错误。本文章向码农介绍CodeIgniter 如何解决URL含有中文字符串。

你 可能会说,那我把这个URL使用函数urlencode一下呢?不行。因为Web Server会在接收到一个被urlencode的URL后自动将其decode,然后在PHP里得到的这些字符串转换成他原来所代表的含义,并使用 Web Server自己的URL编码字符集(IIS6 中文版是GBK,Apache 2.2是UTF-8)传送给应用程序,这就使得CI得到的URL已经是一个解码过的,无论你有没有对URL进行urlencode,浏览器在发出请求时会 自动检测,若没有,则会自动进行编码。所以,手动的进行urlencode并不能解决问题。那么我们应该怎么做来解决这个问题呢?

对于CI这种框架,用到现在,我的观点是尽量不要去修改它,而是去扩展他,CI提供了很好的扩展机制,我们只需要在application/core/下(2.0版本以前的为application/libraries/)增加一个文件MY_URI.php,其内容为:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
 
class MY_URI extends CI_URI { 
 
 /** 
  * 自定义的url过滤函数 
  * 
  * @access private 
  * @param string 
  * @return string 
  */ 
 function _filter_uri($str) 
 { 
  if ($str != '' AND $this->config->item('permitted_uri_chars') != '') 
  { 
   $str = urlencode($str); 
   if ( ! preg_match("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str)) 
   { 
    exit('The URI you submitted has disallowed characters.'); 
   } 
   $str = urldecode($str); 
  } 
  return $str; 
 }  
}

我覆盖了原来CI_URI中的_filter_uri方法,这样就可以使得中文的URL通过检测。但是,如果URL里有空格, 也不行了,怎么办呢?原来,urlencode会将空格转换成+,而CI的默认配置中是不允许+出现在URL里的,OK,把

$config ['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';

改成

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\+\-';

就可以了。

或者

第一步把config.php 中的

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';

 

替换成

$config['permitted_uri_chars'] ='a-z 0-9~%.:_-u4e00-u9fa5';

面所有的操作我们都做完了,但是接下来你可能又遇到了新的问题,那就是url中得到的中文信息是乱码,不知道在你的服务器上会不会遇到该问题,但是我遇到了(IIS)。但是在本地是正常的,本地用的是apache。

好,我在程序中,把$_SERVER['REQUEST_URI']打印出来,发现它就是乱码的,苦思冥想,这是怎么回事?这就说明在我得到uri中的参数之前,就已经被编码了,好,我们使用iconv解码:

iconv("gb2312","UTF-8",$uri);

现在打印出来看看,好了,原来的中文参数打印出来了,是正确的。

这个问题解决了,但是还是有一个疑问,url为什么是gb2312编码的呢,如果在我的程序中使用(我采用的是utf-8编码),还需要转换为utf-8编码,是不是和web服务器是有关系的呢,希望大家能够帮忙解答。

以上这篇CodeIgniter 完美解决URL含有中文字符串就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php&amp;java(一)
Oct 09 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
php GeoIP的使用教程
Mar 09 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
php正则表达式获取内容所有链接
Jul 24 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 PHP
PHP控制循环操作的时间
Apr 01 PHP
php htmlentities()函数的定义和用法
May 13 #PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 #PHP
php调用自己java程序的方法详解
May 13 #PHP
Linux php 中文乱码的快速解决方法
May 13 #PHP
PHP 返回13位时间戳的实现代码
May 13 #PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 #PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 #PHP
You might like
php实现的简单日志写入函数
2015/03/31 PHP
php数组随机排序实现方法
2015/06/13 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
马来西亚在线健康商店:Medipal Malaysia
2020/04/13 全球购物
北京振戎融通Java面试题
2015/09/03 面试题
煤矿班组长岗位职责
2013/12/29 职场文书
项目合作协议书范本
2014/04/16 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
内乡县衙导游词
2015/02/05 职场文书
护士业务学习心得体会
2016/01/25 职场文书
送给客户微信问候语!
2019/07/04 职场文书
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫