CodeIgniter 完美解決URL含有中文字符串
來源:易賢網(wǎng) 閱讀:894 次 日期:2016-08-23 15:18:07
溫馨提示:易賢網(wǎng)小編為您整理了“CodeIgniter 完美解決URL含有中文字符串”,方便廣大網(wǎng)友查閱!

codeIgniter默認(rèn)的配置下是不允許URL中包含非ASCII字符的,如果URL中含非ASCII字符,那么CI會(huì)毫不客氣的拋出錯(cuò)誤。本文章向碼農(nóng)介紹CodeIgniter 如何解決URL含有中文字符串。

你 可能會(huì)說,那我把這個(gè)URL使用函數(shù)urlencode一下呢?不行。因?yàn)閃eb Server會(huì)在接收到一個(gè)被urlencode的URL后自動(dòng)將其decode,然后在PHP里得到的這些字符串轉(zhuǎn)換成他原來所代表的含義,并使用 Web Server自己的URL編碼字符集(IIS6 中文版是GBK,Apache 2.2是UTF-8)傳送給應(yīng)用程序,這就使得CI得到的URL已經(jīng)是一個(gè)解碼過的,無論你有沒有對URL進(jìn)行urlencode,瀏覽器在發(fā)出請求時(shí)會(huì) 自動(dòng)檢測,若沒有,則會(huì)自動(dòng)進(jìn)行編碼。所以,手動(dòng)的進(jìn)行urlencode并不能解決問題。那么我們應(yīng)該怎么做來解決這個(gè)問題呢?

對于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過濾函數(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; 

 }  

}

我覆蓋了原來CI_URI中的_filter_uri方法,這樣就可以使得中文的URL通過檢測。但是,如果URL里有空格, 也不行了,怎么辦呢?原來,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'; 

面所有的操作我們都做完了,但是接下來你可能又遇到了新的問題,那就是url中得到的中文信息是亂碼,不知道在你的服務(wù)器上會(huì)不會(huì)遇到該問題,但是我遇到了(IIS)。但是在本地是正常的,本地用的是apache。

好,我在程序中,把$_SERVER['REQUEST_URI']打印出來,發(fā)現(xiàn)它就是亂碼的,苦思冥想,這是怎么回事?這就說明在我得到uri中的參數(shù)之前,就已經(jīng)被編碼了,好,我們使用iconv解碼:

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

現(xiàn)在打印出來看看,好了,原來的中文參數(shù)打印出來了,是正確的。

這個(gè)問題解決了,但是還是有一個(gè)疑問,url為什么是gb2312編碼的呢,如果在我的程序中使用(我采用的是utf-8編碼),還需要轉(zhuǎn)換為utf-8編碼,是不是和web服務(wù)器是有關(guān)系的呢,希望大家能夠幫忙解答。

以上這篇CodeIgniter 完美解決URL含有中文字符串就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:CodeIgniter 完美解決URL含有中文字符串
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)