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 不同编码下的字符串长度区分
Sep 26 PHP
PHP extract 将数组拆分成多个变量的函数
Jun 30 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
php中header设置常见文件类型的content-type
Jun 23 PHP
分享50个提高PHP执行效率的技巧
Dec 26 PHP
thinkphp制作404跳转页的简单实现方法
Sep 22 PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 PHP
详解php中的implements 使用
Jun 13 PHP
php屏蔽错误及提示的方法
May 10 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
全文搜索和替换
2006/10/09 PHP
PHP入门速成教程
2007/03/19 PHP
php 分页函数multi() discuz
2009/06/21 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
PHP常用数组函数介绍
2014/07/28 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP中soap用法示例【SoapServer服务端与SoapClient客户端编写】
2018/12/25 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python 读写文件的操作代码
2018/09/20 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
Django 自动生成api接口文档教程
2019/11/19 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
浅析python中的del用法
2020/09/02 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
当当网软件测试笔试题
2015/11/24 面试题
个人求职简历的自我评价范文
2013/10/09 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
英语专业自荐书
2014/06/13 职场文书
股指期货心得体会
2014/09/10 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
《藏戏》教学反思
2016/02/23 职场文书