2013-03-15 66 views
1

進入此網址到瀏覽器:http://www.google.com/?q=äUTF8編碼像瀏覽器的網址確實

的發送URL實際上是http://www.google.com/?q=%C3%A4

我想要做的使用PHP相同的轉換 - 怎麼辦?

我的嘗試:

$url = 'http://www.google.com/?q=ä'; //utf8 encoded 

echo rawurlencode($url); 
//gives http%3A%2F%2Fwww.google.com%2F%3Fq%3D%C3%A4 

$u = parse_url($url); 
echo $url['scheme'].'://'.$url['host'].$url['path'].'?'.rawurlencode($url['query']); 
//gives http://www.google.com/?q%3D%C3%A4 

上述網址北京時間只是一個簡單的例子,我需要一個通用的解決方案,也可用於

http://www.example.com/ä 
http://www.example.com/ä?foo=ä&bar=ö 
http://www.example.com/Περιβάλλον?abc=Περιβάλλον 

這裏提供的答案是不通用的不夠: How to encode URL using php like browsers do

+0

http://www.php.net/manual/en/function.rawurlencode.php – Lixas 2013-03-15 08:02:44

+0

Lixas:感謝,但號請閱讀問題。 – 2013-03-15 08:11:29

+0

我改正了我的答案。告訴我,如果這是你正在尋找.. :) – Smuuf 2013-03-15 09:27:29

回答

6

好吧,我花了一些時間,但我覺得我有通用的解決方案:

function safe_urlencode($txt){ 
    // Skip all URL reserved characters plus dot, dash, underscore and tilde.. 
    $result = preg_replace_callback("/[^-\._~:\/\?#\\[\\]@!\$&'\(\)\*\+,;=]+/", 
    function ($match) { 
     // ..and encode the rest! 
     return rawurlencode($match[0]); 
    }, $txt); 
    return ($result); 
} 

基本上它拆分使用URL保留字符http://www.ietf.org/rfc/rfc3986.txt)+ 一些字符的字符串(因爲我認爲這個「小點」也應該單獨存在),其餘的是rawurlencode()

echo safe_urlencode("http://www.google.com/?q=ä"); 
// http://www.google.com/?q=%C3%A4 

echo safe_urlencode("http://www.example.com/Περιβάλλον?abc=Περιβάλλον"); 
// http://www.example.com/%CE%A0%CE%B5%CF%81%CE%B9%CE%B2%CE%AC%CE%BB%CE%BB%CE%BF%CE%BD?abc=%CE%A0%CE%B5%CF%81%CE%B9%CE%B2%CE%AC%CE%BB%CE%BB%CE%BF%CE%BD 
//^This is some funky stuff, but it should be right 
-1

看起來要編碼的URI的query部分,而不改變架構和主機。

序言

有由語言運到實現這一目標,因爲是不可能的語言來知道你是否會使用編碼的字符串爲redirectquery argument(沒有通用的功能呢?URL = HTTP %3A%3A ....)

因此,開發人員必須提取要編碼的部分。

回答

封裝自己的代碼的功能。

function encodeUrlQuery($url) { 
    $u = parse_url($url); 
    return $u['scheme'].'://'.$u['host'].$u['path'].'?'.rawurlencode($u['query']); 
} 

echo encodeUrl('http://www.google.com/?q=ä'); 
+0

正如我在問題中已經說過的,我已經試過了,它不會做我需要的東西 – 2013-03-15 08:10:53

+0

澄清你需要的 – Maks3w 2013-03-15 08:11:25

+0

好吧,讀一下這個問題,有什麼不明白的地方? – 2013-03-15 08:14:51