2014-03-12 25 views
8

我很好奇,如果我應該用ASCII或UTF-8編碼網址。我相信網址不能有非ASCII字符,但是有人告訴我他們可以使用UTF-8,並且我搜索了四周,無法找到哪一個是真的。有人知道嗎?網址可以有UTF-8字符嗎?

+0

可能重複(http://stackoverflow.com/questions/2742852/unicode-characters-in-urls) – Rafa

回答

4

這有兩個部分,但它們都是「是」。

隨着IDNA,可以使用完整的Unicode劇目(有一些小的波折,防止歧義和濫用)註冊域名。

路徑部分沒有嚴格規定,但可以在路徑中編碼任意字符串。瀏覽器可以選擇顯示一個人類可讀的渲染而不是編碼路徑。但是,這需要啓發法,因爲沒有辦法指定路徑的字符集和編碼。

因此,http://xn--msic-0ra.example/mot%C3%B6rhead是一個(虛構的例子,不完全正確)計算機可讀的編碼的URL,可以顯示給用戶http://müsic.example/motörhead。該域名被編碼爲xn--msic-0ra.example,名稱爲Punycode,路徑中包含編碼爲UTF-8和URL編碼的標籤「motörhead」(Unicode代碼點U+00F6以UTF-8中的兩個字節0xC3 0xB6表示)。

該路徑也可以是mot%F6rhead,這是Latin-1中的相同標籤。在這種情況下,推導出一個合理的人類可讀表示將會更加困難,但也許周圍角色的環境可以提供足夠的提示以進行良好的猜測。

單獨地,%F6幾乎可以是任何東西,並且%C3%B6可以是例如。 UTF-16。

+0

你在編寫「UTF-8」時可能意味着「Unicode」。無論如何,這並不能從根本上改變我的答案。 – tripleee

+16

其實它們都是「否」。域和URL都不能包含任何非ASCII字符。 *但是,有一些方法可以將任意字符編碼爲ASCII(百分比編碼和punycode)... – deceze

+0

+1 @deceze( - :好的,是的,規範的URL不包含Unicode,但是IDNA的努力尤其非常多關於定義和實現人性化的半規範表示。 – tripleee

-1

是的,url路徑可以包含UTF8字符。實際上,一個bot在我的網站上請求路徑/â��。當我檢查$_SERVER['REQUEST_URI']時,這個值只是一些二進制垃圾,/???。事實證明,$ _SERVER ['REQUEST_URI']已經被解碼,但是當它被解碼時,它會破壞很多UTF8字符,尤其是utf8mb4。

要解決它,我這樣做:

$_SERVER['REQUEST_URI'] = rawurldecode($_SERVER['UNENCODED_URL']); 
的[URL中的Unicode字符]
相關問題