2015-06-19 39 views
1

我想用Punycode編碼一些Unicode URL。這些URL都包含非ASCII字符的查詢參數,例如:Punycode爲Unicode查詢參數

https://en.wiktionary.org/w/index.php?title=Clœlia&printable=yes 

的問題是,當我嘗試做它在Java中,產生的URL是錯誤的:

String link = "https://en.wiktionary.org/w/index.php?title=Clœlia&printable=yes"; 
link = IDN.toASCII(link); 

// -> link = http://en.wiktionary.org/w/index.xn--php?title=cllia&printable=yes-hgf 

如果我這樣做,這樣,得到的字符串是不同的(我不知道爲什麼),但也是錯誤的:

String link = "http://en.wiktionary.org/w/index.php?title=" + IDN.toASCII("Clœlia") + "&printable=yes"; 

// -> link = http://en.wiktionary.org/w/index.php?title=xn--cllia-ibb&printable=yes 

如果我複製從Chrome中的地址,並將其粘貼在這裏,我得到這個URL,這是我想要的:

https://en.wiktionary.org/w/index.php?title=Cl%C5%93lia&printable=yes 

我在這裏做錯了什麼?

回答

1

你做錯了什麼是使用punycode。 Punycode用於域名,包括域名部分的一個URL,只有

URL的其他部分(包括查詢參數部分)使用Percent Encoding也稱爲URL編碼或URI編碼,這就是Chrome正在做的事情;這將編碼UTF-8中的非ASCII Unicode字符,然後使用百分號(%)和兩個十六進制數字對不在ASCII的有限子集中的所有八位字節進行編碼; UTF-8用於非ASCII的八位字節80-FF始終是%編碼的。 確切地說,查詢參數部分通常和其他部分有時使用爲HTML表單提交定義的輕微變體,如application/x-www-form-urlencoded;這將空間編碼爲加號「+」而不是%20,這是明確的,因爲'+'已經在不安全的集合中,因此被編碼爲%2B。

在Java中使用java.net.URLEncoder.encodejava.net.URLDecoder.decode爲此;爲獲得可靠的結果,請使用編碼名稱爲「UTF-8」的較新的2-arg表單。