2010-06-20 55 views
1

我很難理解如何正確轉義和編碼URL以便在站點地圖中提交的規範和指導原則。網站地圖編碼困境

sitemap.org(實體逸出)的例子,它們具有一個例子URL:

http://www.example.com/ümlat.php&q=name 

當UTF-8編碼的結束其中至多爲(根據它們):

http://www.example.com/%C3%BCmlat.php&q=name 

然而,當我在PHP上嘗試這個(rawurlencode)時,我最終得到:

http%3A%2F%2Fwww.example.com%2F%C3%BCmlat.php%26q%3Dname 

我有點捱打這種通過使用該功能發現PHP.net

$entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', 
    '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%23', '%5B', '%5D'); 

$replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", 
    "$", ",", "/", "?", "#", "[", "]"); 

$string = str_replace($entities, $replacements, rawurlencode($string)); 

,但根據我的人說話(Kohana的BDFM),這種解釋是錯誤的。老實說,我很困惑,我甚至不知道什麼是對的。

什麼是正確的方式來編碼一個URL在站點地圖中使用?

相關RFC 3986

回答

3

的問題是,http://www.example.com/ümlat.php&q=name是不是一個有效的URL。

(來源:RFC 1738,這是過時的,但這裏服務宗旨,RFC 3986確實可以讓更多的字符,但沒有損害是因逃避不需要轉義字符完成)

 
httpurl  = "http://" hostport [ "/" hpath [ "?" search ]] 
hpath   = hsegment *[ "/" hsegment ] 
hsegment  = *[ uchar | ";" | ":" | "@" | "&" | "=" ] 
uchar   = unreserved | escape 
unreserved  = alpha | digit | safe | extra 
safe   = "$" | "-" | "_" | "." | "+" 
extra   = "!" | "*" | "'" | "(" | ")" | "," 
escape   = "%" hex hex 
search   = *[ uchar | ";" | ":" | "@" | "&" | "=" ] 

因此,任何字符除了;:@&=$-_.+!*'(),0-9a-zA-Z字符或轉義序列(例如%A0或等同於%a0)必須轉義。 ?角色最多隻能出現一次。 /字符可以出現在路徑部分中,但不在查詢字符串中。編碼其他字符的慣例是計算它們的UTF-8表示並轉義該序列。

你的算法應該(假設主機部分是沒有問題的......):

  • 提取路徑部分
  • 提取查詢字符串部分
  • 每個那些,尋找無效字符
  • 編碼以UTF-8
  • 這些字符結果傳遞給rawurlencode
  • 替換的字符在該網址的結果爲rawurlencode
+0

完美,謝謝您的詳細解釋。 – 2010-06-21 19:12:56