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 相关文章推荐
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
php和js交互一例-PHP教程,PHP应用
Jan 03 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
php限制ip地址范围的方法
Mar 31 PHP
php实现将上传word文件转为html的方法
Jun 03 PHP
PHP自定义多进制的方法
Nov 03 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
Laravel如何实现自动加载类
Oct 14 PHP
php+laravel依赖注入知识点总结
Nov 04 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同时连接多个mysql数据库示例代码
2014/03/17 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Python装饰器基础详解
2016/03/09 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
django之session与分页(实例讲解)
2017/11/13 Python
python将字符串转换成json的方法小结
2019/07/09 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
python标准库os库的函数介绍
2020/02/12 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
物流管理专业大学生自荐信
2013/10/04 职场文书
保护环境建议书100字
2014/05/13 职场文书
课外活动总结范文
2014/07/09 职场文书
作弊检讨书
2015/01/27 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python