CodeIgniter 完美解決URL含有中文字符串
codeIgniter默認(rèn)的配置下是不允許URL中包含非ASCII字符的,如果URL中含非ASCII字符,那么CI會(huì)毫不客氣的拋出錯(cuò)誤。本文章向碼農(nóng)介紹CodeIgniter 如何解決URL含有中文字符串。
你 可能會(huì)說(shuō),那我把這個(gè)URL使用函數(shù)urlencode一下呢?不行。因?yàn)閃eb Server會(huì)在接收到一個(gè)被urlencode的URL后自動(dòng)將其decode,然后在PHP里得到的這些字符串轉(zhuǎn)換成他原來(lái)所代表的含義,并使用 Web Server自己的URL編碼字符集(IIS6 中文版是GBK,Apache 2.2是UTF-8)傳送給應(yīng)用程序,這就使得CI得到的URL已經(jīng)是一個(gè)解碼過(guò)的,無(wú)論你有沒有對(duì)URL進(jìn)行urlencode,瀏覽器在發(fā)出請(qǐng)求時(shí)會(huì) 自動(dòng)檢測(cè),若沒有,則會(huì)自動(dòng)進(jìn)行編碼。所以,手動(dòng)的進(jìn)行urlencode并不能解決問(wèn)題。那么我們應(yīng)該怎么做來(lái)解決這個(gè)問(wèn)題呢?
對(duì)于CI這種框架,用到現(xiàn)在,我的觀點(diǎn)是盡量不要去修改它,而是去擴(kuò)展他,CI提供了很好的擴(kuò)展機(jī)制,我們只需要在application/core/下(2.0版本以前的為application/libraries/)增加一個(gè)文件MY_URI.php,其內(nèi)容為:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_URI extends CI_URI {
/**
* 自定義的url過(guò)濾函數(shù)
*
* @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;
}
}
我覆蓋了原來(lái)CI_URI中的_filter_uri方法,這樣就可以使得中文的URL通過(guò)檢測(cè)。但是,如果URL里有空格, 也不行了,怎么辦呢?原來(lái),urlencode會(huì)將空格轉(zhuǎn)換成+,而CI的默認(rèn)配置中是不允許+出現(xiàn)在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';
面所有的操作我們都做完了,但是接下來(lái)你可能又遇到了新的問(wèn)題,那就是url中得到的中文信息是亂碼,不知道在你的服務(wù)器上會(huì)不會(huì)遇到該問(wèn)題,但是我遇到了(IIS)。但是在本地是正常的,本地用的是apache。
好,我在程序中,把$_SERVER['REQUEST_URI']打印出來(lái),發(fā)現(xiàn)它就是亂碼的,苦思冥想,這是怎么回事?這就說(shuō)明在我得到uri中的參數(shù)之前,就已經(jīng)被編碼了,好,我們使用iconv解碼:
iconv("gb2312","UTF-8",$uri);
現(xiàn)在打印出來(lái)看看,好了,原來(lái)的中文參數(shù)打印出來(lái)了,是正確的。
這個(gè)問(wèn)題解決了,但是還是有一個(gè)疑問(wèn),url為什么是gb2312編碼的呢,如果在我的程序中使用(我采用的是utf-8編碼),還需要轉(zhuǎn)換為utf-8編碼,是不是和web服務(wù)器是有關(guān)系的呢,希望大家能夠幫忙解答。
以上這篇CodeIgniter 完美解決URL含有中文字符串就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- CodeIgniter 完美解決URL含有中文字符串
- CodeIgniter基于Email類發(fā)郵件的方法
- CodeIgniter分頁(yè)類pagination使用方法示例
- Codeigniter中集成smarty和adodb的方法
- CodeIgniter針對(duì)數(shù)據(jù)庫(kù)的連接、配置及使用方法
- CodeIgniter表單驗(yàn)證方法實(shí)例詳解
- CodeIgniter配置之a(chǎn)utoload.php自動(dòng)加載用法分析
- CodeIgniter控制器之業(yè)務(wù)邏輯實(shí)例分析
- CodeIgniter自定義控制器MY_Controller用法分析
相關(guān)文章
php利用反射實(shí)現(xiàn)插件機(jī)制的方法
這篇文章主要介紹了php利用反射實(shí)現(xiàn)插件機(jī)制的方法,涉及php反射機(jī)制與插件的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-03-03
php引用和拷貝的區(qū)別知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于php引用和拷貝的區(qū)別以及相關(guān)知識(shí)點(diǎn)總結(jié),需要的朋友們學(xué)習(xí)下。2019-09-09
php實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)備份與還原類實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)備份與還原類,可實(shí)現(xiàn)針對(duì)MySQL數(shù)據(jù)庫(kù)的導(dǎo)入與導(dǎo)出功能,并且包含了針對(duì)數(shù)據(jù)庫(kù)操作時(shí)的加鎖與解鎖等功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12
PHP寫的求多項(xiàng)式導(dǎo)數(shù)的函數(shù)代碼
PHP寫的求多項(xiàng)式導(dǎo)數(shù)的函數(shù)代碼,需要的朋友可以參考下2012-07-07
PHP 程序員的調(diào)試技術(shù)小結(jié)
大家都知道在開發(fā)過(guò)程中,代碼的調(diào)式非常重要,對(duì)于一些常見錯(cuò)誤的調(diào)試技巧有助于提高代碼編寫的效率。2009-11-11
php5.3中連接sqlserver2000的兩種方法(com與ODBC)
有時(shí)候我們需要在php5.3環(huán)境中使用sqlserver2000,這里簡(jiǎn)單的介紹下,我們知道新版的php5.3是不支持mysql自帶的mssql_connect這個(gè)數(shù)據(jù)連接函數(shù),如果需要連接sqlserver數(shù)據(jù)庫(kù),我們只能使用了com 接口來(lái)做2012-12-12

