2015-06-14 236 views
3

我正在編寫一個接受來自用戶的URL的PHP​​應用程序,然後通過與system() *進行一些二進制文件調用來處理它。但是,爲了避免由此產生的許多複雜問題,我試圖將可能包含Unicode字符的URL轉換爲ASCII字符。將unicode URL轉換爲ASCII

比方說,我有以下網址:

https://täst.de:8118/news/zh-cn/新聞動態/2015/ 

這裏有兩個部分需要要處理:主機名和路徑。

  • 對於主機名,我可以簡單地撥打idn_to_ascii()
  • 但是,我不能簡單地在路徑上調用urlencode(),因爲每個需要保持未修改的字符也將被轉換(例如news/zh-cn/新聞動態/2015/ -> news%2Fzh-cn%2F%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81%2F2015%2F而不是news/zh-cn/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/2015/)。

我該如何解決這個問題?


*我寧願不system()調用和產生的複雜處理,但鑑於該功能只能通過調用可用的二進制文件,不幸的是我沒有選擇。

+0

你可以將它分割成斜槓,在每個元素的循環中運行urlencode(),然後加入它? – Lance

回答

0

可用於這一轉變下:

function convertpath ($path) { 
    $path1 = ''; 
    $len = strlen ($path); 
    for ($i = 0; $i < $len; $i++) { 
    if (preg_match ('/^[A-Za-z0-9\/?=+%_.~-]$/', $path[$i])) { 
     $path1 .= $path[$i]; 
    } 
    else { 
     $path1 .= urlencode ($path[$i]); 
    } 
    } 
    return $path1; 
} 
1

分裂URL由/然後urlencode()那部分,然後把它重新走到一起

$url = explode("/", $url); 
$url[2] = idn_to_ascii($url[2]); 
$url[5] = urlencode($url[5]); 
$url = join("/", $url); 
0

你可以使用PHP的iconv功能:

inconv("UTF-8", "ASCII//TRANSLIT", $url);