urlencoder和urldecoder的使用

今天傳url的時候亂碼了。先說情形,url中有searchText=中文的情形,後臺new String(searchText.getBytes(ISO-8859-1),"gbk")來獲取,jsp中的是GBK的編碼,服務器用的是jboss,裏面有個server.xml有以下配置。html

<Connector port="80" address="${jboss.bind.address}"    
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIENCODING="UTF-8"/>

以前是沒有uriencoding這個屬性的,我給幹掉,問題解決,這時候用的是默認值即ISO-8859-1。

關於server.xml的配置能夠參考這個url的文檔java

http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.htmlweb

問題解決的過程當中,我特地研究了一下urlencode和urldecode這兩個類,之因此沒有用這種方案是由於我得到頁面上的鏈接的時候用的是一個開源的叫作Cloud的類。shell

網頁中的表單使用POST方法提交時,數據內容的類型是 application/x-www-form-urlencoded,這種類型會: 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不會被編碼; 2.將空格轉換爲加號 (+) ; 3.將非文本內容轉換成"%xy"的形式,xy是兩位16進制的數值; 4.在每一個 name=value 對之間放置 & 符號。
編碼過程很是簡單,任何字符只要不是ASCII碼數字,字母,或者前面提到的標點符,它們都將被轉換成字節形式,每一個字節都寫成這種形式:一個「%」後面跟着兩位16進制的數值。空格是一個特殊狀況,由於它們太日常了。它除了被編碼成「%20」之外,還能編碼爲一個「+」。加號(+)自己被編碼爲%2B。當/ # = & 和?做爲名字的一部分來使用時,而不是做爲URL部分之間的分隔符來使用時,它們都應該被編碼。
類URL並不自動執行編碼或解碼工做。你能生成一個URL對象,它能夠包括非法的ASCII和非ASCII字符和/或%xx。當用方法getPath() 和toExternalForm( ) 做爲輸出方法時,這種字符和轉移符不會自動編碼或解碼。你應對被用來生成一個URL對象的字符串對象負責,確保全部字符都會被恰當地編碼。

URLencode這個類負責把String編碼成平臺上的通用形式,urldecode類能夠把url轉換成string格式。

下面是urlencode的demo:

public static void main(String[] args) {
	    try {
	     System.out.println(URLEncoder.encode("This string has spaces","UTF-8"));
	     System.out.println(URLEncoder.encode("This*string*has*asterisks","UTF-8"));
	     System.out.println(URLEncoder.encode("This%string%has%percent%signs", "UTF-8"));
	     System.out.println(URLEncoder.encode("This+string+has+pluses","UTF-8"));
	     System.out.println(URLEncoder.encode("This/string/has/slashes","UTF-8"));
	     System.out.println(URLEncoder.encode("This\"string\"has\"quote\"marks", "UTF-8"));
	     System.out.println(URLEncoder.encode("This:string:has:colons","UTF-8"));
	     System.out.println(URLEncoder.encode("This~string~has~tildes","UTF-8"));
	     System.out.println(URLEncoder.encode("This(string)has(parentheses)", "UTF-8"));
	     System.out.println(URLEncoder.encode("This.string.has.periods","UTF-8"));
	     System.out.println(URLEncoder.encode("This=string=has=equals=signs", "UTF-8"));
	     System.out.println(URLEncoder.encode("This&string&has&ersands","UTF-8"));
	     System.out.println(URLEncoder.encode("Thiséstringéhasé non-ASCII characters","UTF-8"));
	     System.out.println(URLEncoder.encode("this中華人民共和國","UTF-8"));
	   } catch (UnsupportedEncodingException ex) {throw new RuntimeException("Broken VM does not support UTF-8");
	  }
	 }

執行結果以下:

This+string+has+spaces
This*string*has*asterisks
This%25string%25has%25percent%25signs
This%2Bstring%2Bhas%2Bpluses
This%2Fstring%2Fhas%2Fslashes
This%22string%22has%22quote%22marks
This%3Astring%3Ahas%3Acolons
This%7Estring%7Ehas%7Etildes
This%28string%29has%28parentheses%29
This.string.has.periods
This%3Dstring%3Dhas%3Dequals%3Dsigns
This%26string%26has%26ersands
This%C3%A9string%C3%A9has%C3%A9+non-ASCII+characters
this%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD

很明顯url中有/%&=這類字符也會被編碼,對於咱們來講是不對的。例如

public static void main(String[] args) {
		try {
			System.out.println(URLEncoder.encode("pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3","UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

這個結果就是不對的了,會有以下輸出:

pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

因此這種情形咱們要對每一部分作分段encode

pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

對於urldecoder類來講

它們解碼以x-www-form-url-encoded這種形式編碼的string。也就是說,它們把全部的加號(+)轉換成空格符,把全部的%xx分別轉換成與之相對應的字符

直接上demo:

public static void main(String[] args) {
		String input = "http://www.altavista.com/cgi-bin/" + "query?pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3"; 
		String output;
		try {
			output = URLDecoder.decode(input, "UTF-8");
			System.out.println(output); 
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} 
	}

輸入的結果以下:

http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&stype=stext&q=+"Java I/O"&search.x=38&search.y=3

更多的能夠參考這個文章:

http://www.java3z.com/cwbwebhome/article/article2/2414.html服務器

總結一下,今天發生的中文亂碼的問題最終的解決方案可能和urlencode和urldecode沒有多大關係,這裏有時間還要熟悉一下jboss的server.xml的配置文件。urlencode主要有encode方法,用來把url中非數字和字母的字符轉換成%加兩位16進制。urldecode主要有decode方法,用來把一個含有%加兩位16進制的url轉換成正常的編碼。app

相關文章
相關標籤/搜索