`
jaesonchen
  • 浏览: 311243 次
  • 来自: ...
社区版块
存档分类
最新评论

URL中文乱码问题

 
阅读更多

我们主要通过两种形式提交向服务器发送请求:URL、表单。而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面。通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。如果程序员要把每一种结果都考虑进去,是不是太恐怖了?有没有办法,能够保证客户端只用一种编码方法向服务器发出请求?

有!这里我主要提供以下几种方法

一、javascript

使用JavaScript编码不给浏览器插手的机会,编码之后再向服务器发送请求,然后在服务器中解码。在掌握该方法的时候,我们需要料及javascript编码的三个方法:escape()、encodeURI()、encodeURIComponent()。

escape

采用SIO Latin字符集对指定的字符串进行编码。所有非ASCII字符都会被编码为%xx格式的字符串,其中xx表示该字符在字符集中所对应的16进制数字。例如,格式对应的编码为%20。它对应的解码方法为unescape()。

201501150002

事实上escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如上面“我是cm”的结果为%u6211%u662Fcm,其中“我”对应的编码为6211,“是”的编码为662F,“cm”编码为cm。

注意,escape()不对"+"编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。

encodeURI

对整个URL进行编码,它采用的是UTF-8格式输出编码后的字符串。不过encodeURI除了ASCII编码外对于一些特殊的字符也不会进行编码如:! @ # $& * ( ) = : / ; ? + '。

201501150003

encodeURIComponent

把URI字符串采用UTF-8编码格式转化成escape格式的字符串。相对于encodeURI,encodeURIComponent会更加强大,它会对那些在encodeURI()中不被编码的符号(; / ? : @ & = + $ , #)统统会被编码。但是encodeURIComponent只会对URL的组成部分进行个别编码,而不用于对整个URL进行编码。对应解码函数方法decodeURIComponent。

当然我们一般都是使用encodeURI方来进行编码操作。所谓的javascript两次编码后台两次解码就是使用该方法。javascript解决该问题有一次转码、两次转码两种解决方法。

一次转码

javascript转码:

  1. var url = '<s:property value="webPath" />/ShowMoblieQRCode.servlet?name=我是cm';  
  2. window.location.href = encodeURI(url);  

 

转码后的URL:http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%E6%88%91%E6%98%AFcm

后台处理:

  1. String name = request.getParameter("name");  
  2. System.out.println("前台传入参数:" + name);  
  3. name  = new String(name.getBytes("ISO-8859-1"),"UTF-8");  
  4. System.out.println("经过解码后参数:" + name);  

 

输出结果:

前台传入参数:??????cm 
经过解码后参数:我是cm

二次转码

javascript

  1. var url = '<s:property value="webPath" />/ShowMoblieQRCode.servlet?name=我是cm';  
  2. window.location.href = encodeURI(encodeURI(url));  

 

转码后的url:http://127.0.0.1:8080/perbank/ShowMoblieQRCode.servlet?name=%25E6%2588%2591%25E6%2598%25AFcm

后台处理:

  1. String name = request.getParameter("name");  
  2. System.out.println("前台传入参数:" + name);  
  3. name  = URLDecoder.decode(name,"UTF-8");  
  4. System.out.println("经过解码后参数:" + name);  

 

输出结果:

前台传入参数:E68891E698AFcm 

经过解码后参数:我是cm

 

filter

使用过滤器,过滤器LZ提供两种,第一种设置编码,第二种直接在过滤器中进行解码操作。

过滤器1

该过滤器是直接设置request的编码格式的。

  1. public class CharacterEncoding implements Filter {  
  2.   
  3.     private FilterConfig config ;  
  4.     String encoding = null;  
  5.       
  6.     public void destroy() {  
  7.         config = null;  
  8.     }  
  9.   
  10.     public void doFilter(ServletRequest request, ServletResponse response,  
  11.             FilterChain chain) throws IOException, ServletException {  
  12.         request.setCharacterEncoding(encoding);  
  13.         chain.doFilter(request, response);  
  14.     }  
  15.   
  16.     public void init(FilterConfig config) throws ServletException {  
  17.         this.config = config;  
  18.         //获取配置参数  
  19.         String str = config.getInitParameter("encoding");  
  20.         if(str!=null){  
  21.             encoding = str;  
  22.         }  
  23.     }  
  24.   
  25. }  

 

配置:

  1. <!-- 中文过滤器的配置 -->  
  2.     <filter>  
  3.         <filter-name>chineseEncoding</filter-name>  
  4.         <filter-class>com.test.filter.CharacterEncoding</filter-class>  
  5.           
  6.         <init-param>  
  7.             <param-name>encoding</param-name>  
  8.             <param-value>utf-8</param-value>  
  9.         </init-param>  
  10.     </filter>  
  11.       
  12.     <filter-mapping>  
  13.         <filter-name>chineseEncoding</filter-name>  
  14.         <url-pattern>/*</url-pattern>  
  15.     </filter-mapping>  

 

过滤器2

该过滤器在处理方法中将参数直接进行解码操作,然后将解码后的参数重新设置到request的attribute中。

  1. public class CharacterEncoding implements Filter {  
  2.     protected FilterConfig filterConfig ;  
  3.     String encoding = null;  
  4.       
  5.     public void destroy() {  
  6.         this.filterConfig = null;  
  7.     }  
  8.   
  9.     /** 
  10.      * 初始化 
  11.      */  
  12.     public void init(FilterConfig filterConfig) {  
  13.         this.filterConfig = filterConfig;  
  14.     }  
  15.   
  16.     /** 
  17.      * 将 inStr 转为 UTF-8 的编码形式 
  18.      *  
  19.      * @param inStr 输入字符串 
  20.      * @return UTF - 8 的编码形式的字符串 
  21.      * @throws UnsupportedEncodingException 
  22.      */  
  23.     private String toUTF(String inStr) throws UnsupportedEncodingException {  
  24.         String outStr = "";  
  25.         if (inStr != null) {  
  26.             outStr = new String(inStr.getBytes("iso-8859-1"), "UTF-8");  
  27.         }  
  28.         return outStr;  
  29.     }  
  30.   
  31.     /** 
  32.      * 中文乱码过滤处理 
  33.      */  
  34.     public void doFilter(ServletRequest servletRequest,  
  35.             ServletResponse servletResponse, FilterChain chain) throws IOException,  
  36.             ServletException {  
  37.         HttpServletRequest request = (HttpServletRequest) servletRequest;  
  38.         HttpServletResponse response = (HttpServletResponse) servletResponse;  
  39.   
  40.         // 获得请求的方式 (1.post or 2.get), 根据不同请求方式进行不同处理  
  41.         String method = request.getMethod();  
  42.         // 1. 以 post 方式提交的请求 , 直接设置编码为 UTF-8  
  43.         if (method.equalsIgnoreCase("post")) {  
  44.             try {  
  45.                 request.setCharacterEncoding("UTF-8");  
  46.             } catch (UnsupportedEncodingException e) {  
  47.                 e.printStackTrace();  
  48.             }  
  49.         }  
  50.         // 2. 以 get 方式提交的请求  
  51.         else {  
  52.             // 取出客户提交的参数集  
  53.             Enumeration<String> paramNames = request.getParameterNames();  
  54.             // 遍历参数集取出每个参数的名称及值  
  55.             while (paramNames.hasMoreElements()) {  
  56.                 String name = paramNames.nextElement(); // 取出参数名称  
  57.                 String values[] = request.getParameterValues(name); // 根据参数名称取出其值  
  58.                 // 如果参数值集不为空  
  59.                 if (values != null) {  
  60.                     // 遍历参数值集  
  61.                     for (int i = 0; i < values.length; i++) {  
  62.                         try {  
  63.                             // 回圈依次将每个值调用 toUTF(values[i]) 方法转换参数值的字元编码  
  64.                             String vlustr = toUTF(values[i]);  
  65.                             values[i] = vlustr;  
  66.                         } catch (UnsupportedEncodingException e) {  
  67.                             e.printStackTrace();  
  68.                         }  
  69.                     }  
  70.                     // 将该值以属性的形式藏在 request  
  71.                     request.setAttribute(name, values);  
  72.                 }  
  73.             }  
  74.   
  75.         }  
  76.         // 设置响应方式和支持中文的字元集  
  77.         response.setContentType("text/html;charset=UTF-8");  
  78.   
  79.         // 继续执行下一个 filter, 无一下个 filter 则执行请求  
  80.         chain.doFilter(request, response);  
  81.     }  
  82. }  

 

配置:

  1. <!-- 中文过滤器的配置 -->  
  2.     <filter>  
  3.         <filter-name>chineseEncoding</filter-name>  
  4.         <filter-class>com.test.filter.CharacterEncoding</filter-class>  
  5.     </filter>  
  6.       
  7.     <filter-mapping>  
  8.         <filter-name>chineseEncoding</filter-name>  
  9.         <url-pattern>/*</url-pattern>  
  10.     </filter-mapping>  

 

其他

1、设置pageEncoding、contentType

  1. <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>  

 

2、设置tomcat的URIEncoding

在默认情况下,tomcat服务器使用的是ISO-8859-1编码格式来编码的,URIEncoding参数对get请求的URL进行编码,所以我们只需要在tomcat的server.xml文件的<Connector>标签中加上URIEncoding="utf-8"即可。


-----原文出自:http://cmsblogs.com/?p=1526,请尊重作者辛勤劳动成果,转载说明出处.

分享到:
评论

相关推荐

    java中文乱码之解决URL中文乱码问题的方法

    URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要了解URL编码的基本原理。URL(统一资源定位符)不能包含某些特殊字符,如...

    java中文乱码解决之道(8)解决URL中文乱码问题Jav

    本文将深入探讨如何在Java中有效地解决URL中文乱码问题。 首先,我们需要理解URL编码的原理。URL编码遵循RFC 3986标准,它规定了在URL中非ASCII字符应被转换为百分号编码形式(%xy),其中xy是该字符的UTF-8编码的...

    Android Url中文乱码问题

    在开发过程中遇到了Url的中文乱码问题,经过多次测试,解决了问题,并分享给大家,希望能够你帮助!

    解决url中文乱码.doc

    在Java Web开发中,URL中文乱码问题是一个常见的困扰,主要出现在传递含有中文字符的参数时。本案例中,我们将探讨如何解决这个问题,涉及到的主要知识点包括URL编码、字符集转换以及在Java Servlet、JSP和Struts2...

    IOS URL中文乱码问题解决方案

    总之,解决iOS URL中文乱码问题的关键在于正确地对URL进行编码,避免不必要的重复编码,并在需要时使用适当的解码方法。同时,了解URL编码的原理和标准,以及如何在不同平台间正确传递和处理这些信息,对于开发过程...

    asp.net中URL参数传值中文乱码的三种解决办法

    了解这些基本概念后,结合以上三种方法,我们可以有效解决ASP.NET中URL参数传递中文时的乱码问题。在实际开发中,应根据具体项目需求和环境选择合适的方法,确保数据的正确传递。同时,为了兼容更多情况,建议在开发...

    jquery获取URL中参数解决中文乱码问题的两种方法

    当我们需要在两个页面间通过URL传递参数时,经常会遇到中文乱码问题。这个问题主要是因为URL中的参数可能没有经过正确的编码和解码处理。为了解决这个问题,我们可以采取一些方法,特别是当使用jQuery来获取URL参数...

    URL中汉字乱码问题

    标题“URL中汉字乱码问题”涉及到的是在Web开发中常见的字符编码问题,尤其是在处理包含汉字的URL时。URL(Uniform Resource Locator)是用于定位网络资源的地址,它必须遵循特定的编码规则,以确保在不同系统间传输...

    中文乱码问题分析 自己总结的

    中文乱码问题分析 中文乱码问题是 Java 和 JSP 开发中的一种常见问题,主要是由于 Java 和 JSP 源文件的保存方式是基于字节流的,而编译成 class 文件过程中,使用的编码方式与源文件的编码不一致所致。在 Java ...

    java URL中文参数乱码处理

    js 中乱码处理法方式 encodeURIComponent(encodeURIComponent(customerAddress)) decodeURIComponent(customerName) js到java encodeURI(url) String qijuType= new String(request.getParameter( (...

    url中文乱码处理大全.docx

    通过使用过滤器,我们可以更方便地管理URL中文乱码问题,无需在每个请求处理代码中添加转换逻辑,提高了代码的可维护性和一致性。 总的来说,处理URL中文乱码的核心在于理解字符编码的原理以及服务器和客户端之间的...

    php中url地址栏传参数中文乱码解决方法汇总

    解决 PHP 中 URL 地址栏传参数中文乱码问题可以使用 urlencode()、urldecode()、iconv()、mb_convert_encoding()、mb_internal_encoding()、ob_start()、base64_encode() 等多种方法,每种方法都有其特点和使用场景...

    彻底解决中文乱码的问题

    在IT行业中,尤其是在Java编程领域,中文乱码问题是一个常见的挑战。这主要涉及到字符编码的处理,涉及到Unicode、GBK、UTF-8等不同编码格式之间的转换和一致性问题。本篇文章将深入探讨这个问题,并提供一种彻底...

    jsp url中文乱码四种解决方式

    get提交中文乱码 地址重写中文乱码 jsp url中文乱码四种解决方式

    url地址传参中文乱码处理

    "URL地址传参中文乱码处理" URL地址传参中文乱码处理是指在Web应用程序中,将中文参数传递给...在处理URL地址传参中文乱码时,需要根据具体情况选择合适的解决方案,并注意编码问题、特殊字符处理和Tomcat配置等方面。

    奇数个中文字符url传递乱码

    - 对于后端处理中文字符的场景,也需要确保前后端之间编码的一致性,避免因编码不匹配导致的乱码问题。 ### 四、总结 奇数个中文字符URL传递乱码是一个常见但又容易被忽视的问题。通过合理的编码处理,尤其是利用...

    JSP对URL链接中的中文乱码处理方法总结.docx

    JSP 对 URL 链接中的中文乱码处理方法总结 JSP 对 URL 链接中的中文乱码处理方法总结是指在 ...解决 JSP 对 URL 链接中的中文乱码问题需要考虑到浏览器、服务器和编码方式的差异,选择合适的方法来避免中文乱码问题。

    乱码问题的解决

    "乱码问题的解决" 在 Web 开发中,乱码问题是常见的...乱码问题的解决需要从多方面入手,包括设置页面编码、服务器编码、客户端编码、数据库编码和超链接的 url 编码等。只有通过统一编码,才能避免乱码问题的出现。

Global site tag (gtag.js) - Google Analytics