URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼
-------------------------------------------------------------------------------------------------------
本部分轉載自:http://blog.csdn.net/gongxifacai_believe/article/details/51605776
------------------------------------------------------------------------------------------------------------
本部分轉載自:用過濾器來解決JSP中文亂碼問題
- 1 package com.util;
- 2
- 3 import java.io.IOException;
- 4 import java.io.UnsupportedEncodingException;
- 5
- 6 import javax.servlet.Filter;
- 7 import javax.servlet.FilterChain;
- 8 import javax.servlet.FilterConfig;
- 9 import javax.servlet.ServletException;
- 10 import javax.servlet.ServletRequest;
- 11 import javax.servlet.ServletResponse;
- 12 import javax.servlet.http.HttpServletRequest;
- 13 import javax.servlet.http.HttpServletRequestWrapper;
- 14 import javax.servlet.http.HttpServletResponse;
- 15 import javax.servlet.http.HttpSession;
- 16
- 17
- 18 //過濾器處理表單傳到servlet的亂碼問題
- 19 public class MyFilter implements Filter{
- 20 //自寫一個request換掉原來的request,重寫里面的getParemeter方法,可以設置編碼
- 21 class MyRequest extends HttpServletRequestWrapper{
- 22
- 23 @Override
- 24 public String getParameter(String param) {
- 25 String value = null;
- 26 try {
- 27 //post
- 28 super.setCharacterEncoding(encoding);//把編碼轉換為encoding
- 29 value = super.getParameter(param);
- 30 if(super.getMethod().equalsIgnoreCase("GET")){
- 31 if(value!=null){
- 32 value = new String(value.getBytes("iso8859-1"),encoding);
- 33 }
- 34 }
- 35 } catch (UnsupportedEncodingException e) {
- 36 // TODO Auto-generated catch block
- 37 e.printStackTrace();
- 38 }
- 39 return value;
- 40 }
- 41
- 42 public MyRequest(HttpServletRequest request) {
- 43 super(request);
- 44 }
- 45
- 46 }
- 47 protected String encoding=null;
- 48 public void destroy() { //銷毀
- 49 // TODO Auto-generated method stub
- 50 this.encoding=null;
- 51 }
- 52 //對編碼問題進行轉換
- 53 public void doFilter(ServletRequest request, ServletResponse response,
- 54 FilterChain chain) throws IOException, ServletException {
- 55 // TODO Auto-generated method stub
- 56 response.setContentType("text/html;charset="+encoding);
- 57 //過濾未登錄用戶
- 58 HttpServletRequest req = (HttpServletRequest) request;
- 59 HttpServletResponse resp = (HttpServletResponse) response;
- 60 String path=req.getServletPath();
- 61 String param=req.getQueryString();
- 62 if(path!=null){
- 63 path=path+"?"+param;//全請求路徑
- 64 }
- 65 if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){
- 66 HttpSession session = req.getSession();
- 67 String userName = (String) session.getAttribute("username");
- 68 if(userName == null){
- 69 session.setAttribute("url", path.replaceFirst("/", ""));
- 70 System.out.println(session.getAttribute("url"));
- 71 resp.sendRedirect("user.do?op=loginAction");
- 72 return;
- 73 }
- 74 }
- 75 //把過濾器給下一個過濾器或資源處理器
- 76 chain.doFilter(new MyRequest((HttpServletRequest) request), response);
- 77 }
- 78
- 79 public void init(FilterConfig filterConfig) throws ServletException {
- 80 // TODO Auto-generated method stub
- 81 this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定
- 82 }
- 83
- 84 }
然后在web.xml對該過濾器進行注冊和映射:
- <filter>
- <filter-name>EncodingFilter</filter-name>
- <filter-class>com.util.MyFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>EncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping></span>
上面寫的過濾器MyFilter類,本來只能處理post提交的數據(post是先處理后接收,get是先接收后處理)。
但是MyFilter里面在對任何頁面過濾的時候,來了一個偷梁換柱:把原來客戶端請求的request給換掉了,換成自己定義的一個request了,即內部類MyRequest,不過該類要繼承一個類HttpServletRequestWrapper。
在自定義的一個內部類MyRequest里面,實現了一個好強大的功能,就是重寫了request的getParameter()方法。該方法里面即處理了post提交,又能處理get提交,返回的值就是處理后的值,所以該過濾器就能實現處理post和get提交的亂碼問題!
--------------------------------------------------------------------------------------------------
本部分轉載自:URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼
在傳遞參數的時候,如果有中文,那么可以先轉碼再轉,之后再解碼。
--------------------------------------------------------------------------------------------------------------
本部分轉載自:URLEncoder與URLDecoder的使用
今天傳url的時候亂碼了。先說情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")來獲取,jsp中的是GBK的編碼,服務器用的是jboss,里面有個server.xml有如下配置。
- <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的文檔
http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html
問題解決的過程中,我特意研究了一下urlencode和urldecode這兩個類,之所以沒有用這種方案是因為我獲得頁面上的連接的時候用的是一個開源的叫做Cloud的類。
網頁中的表單使用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();
- }
- }
URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼
-------------------------------------------------------------------------------------------------------
本部分轉載自:關於JSP頁面之間傳值的中文亂碼總結
------------------------------------------------------------------------------------------------------------
本部分轉載自:用過濾器來解決JSP中文亂碼問題
- 1 package com.util;
- 2
- 3 import java.io.IOException;
- 4 import java.io.UnsupportedEncodingException;
- 5
- 6 import javax.servlet.Filter;
- 7 import javax.servlet.FilterChain;
- 8 import javax.servlet.FilterConfig;
- 9 import javax.servlet.ServletException;
- 10 import javax.servlet.ServletRequest;
- 11 import javax.servlet.ServletResponse;
- 12 import javax.servlet.http.HttpServletRequest;
- 13 import javax.servlet.http.HttpServletRequestWrapper;
- 14 import javax.servlet.http.HttpServletResponse;
- 15 import javax.servlet.http.HttpSession;
- 16
- 17
- 18 //過濾器處理表單傳到servlet的亂碼問題
- 19 public class MyFilter implements Filter{
- 20 //自寫一個request換掉原來的request,重寫里面的getParemeter方法,可以設置編碼
- 21 class MyRequest extends HttpServletRequestWrapper{
- 22
- 23 @Override
- 24 public String getParameter(String param) {
- 25 String value = null;
- 26 try {
- 27 //post
- 28 super.setCharacterEncoding(encoding);//把編碼轉換為encoding
- 29 value = super.getParameter(param);
- 30 if(super.getMethod().equalsIgnoreCase("GET")){
- 31 if(value!=null){
- 32 value = new String(value.getBytes("iso8859-1"),encoding);
- 33 }
- 34 }
- 35 } catch (UnsupportedEncodingException e) {
- 36 // TODO Auto-generated catch block
- 37 e.printStackTrace();
- 38 }
- 39 return value;
- 40 }
- 41
- 42 public MyRequest(HttpServletRequest request) {
- 43 super(request);
- 44 }
- 45
- 46 }
- 47 protected String encoding=null;
- 48 public void destroy() { //銷毀
- 49 // TODO Auto-generated method stub
- 50 this.encoding=null;
- 51 }
- 52 //對編碼問題進行轉換
- 53 public void doFilter(ServletRequest request, ServletResponse response,
- 54 FilterChain chain) throws IOException, ServletException {
- 55 // TODO Auto-generated method stub
- 56 response.setContentType("text/html;charset="+encoding);
- 57 //過濾未登錄用戶
- 58 HttpServletRequest req = (HttpServletRequest) request;
- 59 HttpServletResponse resp = (HttpServletResponse) response;
- 60 String path=req.getServletPath();
- 61 String param=req.getQueryString();
- 62 if(path!=null){
- 63 path=path+"?"+param;//全請求路徑
- 64 }
- 65 if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){
- 66 HttpSession session = req.getSession();
- 67 String userName = (String) session.getAttribute("username");
- 68 if(userName == null){
- 69 session.setAttribute("url", path.replaceFirst("/", ""));
- 70 System.out.println(session.getAttribute("url"));
- 71 resp.sendRedirect("user.do?op=loginAction");
- 72 return;
- 73 }
- 74 }
- 75 //把過濾器給下一個過濾器或資源處理器
- 76 chain.doFilter(new MyRequest((HttpServletRequest) request), response);
- 77 }
- 78
- 79 public void init(FilterConfig filterConfig) throws ServletException {
- 80 // TODO Auto-generated method stub
- 81 this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定
- 82 }
- 83
- 84 }
然后在web.xml對該過濾器進行注冊和映射:
- <filter>
- <filter-name>EncodingFilter</filter-name>
- <filter-class>com.util.MyFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>EncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping></span>
上面寫的過濾器MyFilter類,本來只能處理post提交的數據(post是先處理后接收,get是先接收后處理)。
但是MyFilter里面在對任何頁面過濾的時候,來了一個偷梁換柱:把原來客戶端請求的request給換掉了,換成自己定義的一個request了,即內部類MyRequest,不過該類要繼承一個類HttpServletRequestWrapper。
在自定義的一個內部類MyRequest里面,實現了一個好強大的功能,就是重寫了request的getParameter()方法。該方法里面即處理了post提交,又能處理get提交,返回的值就是處理后的值,所以該過濾器就能實現處理post和get提交的亂碼問題!
--------------------------------------------------------------------------------------------------
本部分轉載自:URLEncoder.encode與URLDecoder.docode傳遞中文參數編碼與解碼
在傳遞參數的時候,如果有中文,那么可以先轉碼再轉,之后再解碼。
--------------------------------------------------------------------------------------------------------------
本部分轉載自:URLEncoder與URLDecoder的使用
今天傳url的時候亂碼了。先說情形,url中有searchText=中文的情形,后台new String(searchText.getBytes(ISO-8859-1),"gbk")來獲取,jsp中的是GBK的編碼,服務器用的是jboss,里面有個server.xml有如下配置。
- <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的文檔
http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch02.html
問題解決的過程中,我特意研究了一下urlencode和urldecode這兩個類,之所以沒有用這種方案是因為我獲得頁面上的連接的時候用的是一個開源的叫做Cloud的類。
網頁中的表單使用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轉換成正常的編碼。
輸入的結果如下:
- 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轉換成正常的編碼。