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

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

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

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

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

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

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

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

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

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

一次转码
javascript转码:

var url = '/ShowMoblieQRCode.servlet?name=我是cm';
window.location.href = encodeURI(url);

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

后台处理:

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

输出结果:

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

二次转码
javascript

var url = '/ShowMoblieQRCode.servlet?name=我是cm';
window.location.href = encodeURI(encodeURI(url));

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

后台处理:

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

输出结果:

前台传入参数:E68891E698AFcm

经过解码后参数:我是cm

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

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

public class CharacterEncoding implements Filter {
 private FilterConfig config ;
 String encoding = null;
  public void destroy() {
  config = null;
 }
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  request.setCharacterEncoding(encoding);
  chain.doFilter(request, response);
 }
 public void init(FilterConfig config) throws ServletException {
  this.config = config;
  //获取配置参数
  String str = config.getInitParameter("encoding");
  if(str!=null){
   encoding = str;
  }
 }
}

配置:

 <filter>
  <filter-name>chineseEncodingfilter-name>
  <filter-class>
com.test.filter.CharacterEncodingfilter-class>
    <init-param>
   <param-name>encodingparam-name>
   <param-value>utf-8param-value>
  init-param>
 filter>
  <filter-mapping>
  <filter-name>chineseEncodingfilter-name>
  <url-pattern>/*url-pattern>
 filter-mapping>

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

public class CharacterEncoding implements Filter {
 protected FilterConfig filterConfig ;
 String encoding = null;
  public void destroy() {
  this.filterConfig = null;
 }
 /**
 * 初始化
  */
 public void init(FilterConfig filterConfig) {
  this.filterConfig = filterConfig;
 }
 /**
  * 将 inStr 转为 UTF-8 的编码形式
  *
  * @param inStr 输入字符串
  * @return UTF - 8 的编码形式的字符串
  * @throws UnsupportedEncodingException
  */
 private String toUTF(String inStr) throws UnsupportedEncodingException {
  String outStr = "";
  if (inStr != null) {
   outStr = new String(inStr.getBytes("iso-8859-1"), "UTF-8");
  }
  return outStr;
 }
 /**
 * 中文乱码过滤处理
  */
 public void doFilter(ServletRequest servletRequest,
   ServletResponse servletResponse, FilterChain chain) throws IOException,
   ServletException {
  HttpServletRequest request = (HttpServletRequest) servletRequest;
  HttpServletResponse response = (HttpServletResponse) servletResponse;
  // 获得请求的方式 (1.post or 2.get), 根据不同请求方式进行不同处理
  String method = request.getMethod();
  // 1. 以 post 方式提交的请求 , 直接设置编码为 UTF-8
  if (method.equalsIgnoreCase("post")) {
   try {
    request.setCharacterEncoding("UTF-8");
   }
 catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   }
  }
  // 2. 以 get 方式提交的请求
  else {
   // 取出客户提交的参数集
   Enumeration paramNames = request.getParameterNames();
   // 遍历参数集取出每个参数的名称及值
   while (paramNames.hasMoreElements()) {
    String name = paramNames.nextElement();// 取出参数名称
    String values[] = request.getParameterValues(name);// 根据参数名称取出其值
    // 如果参数值集不为空
    if (values != null) {
     // 遍历参数值集
     for (int i = 0; i < values.length; i++) {
      try {
     // 回圈依次将每个值调用 toUTF(values[i]) 方法转换参数值的字元编码
       String vlustr = toUTF(values[i]);
       values[i] = vlustr;
      }
 catch (UnsupportedEncodingException e) {
       e.printStackTrace();
      }
    }
     // 将该值以属性的形式藏在 request
     request.setAttribute(name, values);
    }
   }
  }
  // 设置响应方式和支持中文的字元集
  response.setContentType("text/html;charset=UTF-8");
  // 继续执行下一个 filter, 无一下个 filter 则执行请求
  chain.doFilter(request, response);
 }
}

配置:


 <filter>
  <filter-name>chineseEncodingfilter-name>
  <filter-class>com.test.filter.CharacterEncodingfilter-class>
 filter>
  <filter-mapping>
  <filter-name>chineseEncodingfilter-name>
  <url-pattern>/*url-pattern>
 filter-mapping>

其他

1、设置pageEncoding、contentType

<%@ 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文件的标签中加上URIEncoding=”utf-8″即可。

以上就是本文的全部内容,希望对大家学习java中文乱码问题有帮助

(0)

相关推荐

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

    IE缺省对URL后面的参数是不编码发送的,但是Tomat缺省是按ISO8859-1来进行URL编码的,因此才会出错. 方法一: 对URL链接进行二次编码: <a onclick="javascript:window.open(encodeURI(encodeURI('./DispatchAction.do?efFormEname=FKRY0001&code_type=中文参数')))">测试</a> 或者单独对参数进行二次编码: var code_typ

  • 通过url方式传递中文乱码的解决方法

    例如: 通过url传递中文参数:xxx.do?name=名字&age=十八岁 解决办法: 1.在html页面,通过js的encodeURI方法对字符2次编码 encodeURI(encodeURI(jsonStr)); 2.在后台进行解码 java.net.URLDecoder.decode(jsonStr, "UTF-8");

  • Request.UrlReferrer中文乱码解决方法

    参考了网络大部分的解决方案,没一个能搞定的,如果穷途末路,试试下面的方法: 将获得的前一页面的URL分成两段,后面的参数部分进行编码(直接对URL编码是不行的),然后再组合一下就可以了. 复制代码 代码如下: if(!Page.IsPostBack) { ReUrl = Page.Request.UrlReferrer.ToString().Split('?')[0].ToString() + HttpUtility.UrlEncode(Page.Request.UrlReferrer.Quer

  • jquery.ajax的url中传递中文乱码问题的解决方法

    JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQuery正在乱码的原因,在未指定字符集的时候,是使用ISO-8859-1 ISO8859-1,通常叫做Latin-1.Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符. JQuery的Ajax根本没有考虑到国际化的问题,使用了欧洲的字符集,所以才引起了传递中文出现乱码的问题. 而我们的UTF-8则可以解决这一问题. 最终指需要修改JQuery的代码,显式

  • 伪静态URL中文乱码问题解决方法

    在 ISAPI_Rewrite 1.3 版本时,只要对URL进行UrlEncode操作,就可以正常接收中文,但是换为 3.1版后, 采用GB2312 的接收页面就是乱码了. 换用了ISAPI_Rewrite 3.x后发现编码后的字符会变成乱码,如果直接使用中文不编码,则会被格式化为GBK字符串.解决方法是在RewriteRule 规则的最后添加 NU 参数即可恢复正常,关于ISAPI_Rewrite中文变乱码解决方法如下: 1.在传输URL时,对中文进行urlencode,这样是没错的. 2.如

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

    IOS 解决URL中文乱码问题解决 在做一个HTTPS连接时, 要客户端合成一段HTTPS地址 如果地址含中文的话程序会crash, 检查发现原来是中文没有转码的原因 在NSString库里面找到了下面两个方法 - (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding - (NSString *)stringByReplacingPercentEscapesUsingEncoding:(N

  • 解决URL地址中的中文乱码问题的办法

    解决URL地址中的中文乱码问题的办法 引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生了,该如何解决呢?且听本文详细道来. 1.  问题的引出 在Restful的服务设计中,查询某些信息的时候,一般的URL地址设计为: get /basic/service? keyword=历史 , 之类的URL地址. 但是,在实际的开发和使用中,确是有乱码情况的发生,在后台的读取keyword信息

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

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

  • PHP解决URL中文GBK乱码问题的两种方法

    一般情况下对URL进行UrlEncode 处理 , urlencode(),urldecode(): 也可以通过iconv('utf-8', 'gb2312', $ret)对接收到的数据进行编码转换.

  • Java中URL传中文时乱码的解决方法

    前言 Java中URL传中文时乱码的问题相信不少朋友都遇到过,最近就遇到一个问题,就是在Action当中把一条中文信息绑定在URL的后面,ActionForward到别一个页面时,用reqeust.getParameter取出是出现乱码的问题. 解决办法 1.对要进行URL传递的中文字符进行编码: String message = java.net.URLEncoder.encode("中文字符","utf-8"); 2.在取URL传递中文的页面对字符进行解码: S

  • JS解决url传值出现中文乱码的另类办法

    在开发web应用时,很多情况都需要进行前后台的数据交互,有时候我们可能需要把前台的中文数据通过URL的方式传递到后台,但此时有个令人头疼的问题,因为Java中网络传输使用的标准字符集是ISO-8859-1,所以在后台用request.getParameter("message");获取前台传过来的中文时,得到的还是ISO-8859-1字符集,中文就会出现乱码现象,好多人的解决办法是在前台传递中文之前进行decode,后台再decode一下进行转换,这样感觉很是麻烦,难道就没其他的方式解

  • Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp

  • iis伪静态中文url出现乱码的解决办法

    首先要看下你安装的是IIS rewrite_2.0还是ISAPI_Rewrite 3.x的伪静态插件. 如果你安装的是IIS rewrite_2.0的话,传递的参数都是UTF-8格式的,如果你网站是GBK的就会出现中文连接乱码. 解决办法: rewrite_2.0规则写法: RewriteRule ^news_list_([0-9a-zA-Z\u4e00-\u9fa5]+)\.html$ news_list.asp?BigClassName=$1 [L] 比如页面传递参数是 zhongwen:

  • java实现PPT转PDF出现中文乱码问题的解决方法

    ppt转成pdf,原理是ppt转成图片,再用图片生产pdf,过程有个问题,不管是ppt还是pptx,都遇到中文乱码,编程方框的问题,其中ppt后缀网上随便找就有解决方案,就是设置字体为统一字体,pptx如果页面是一种中文字体不会有问题,如果一个页面有微软雅黑和宋体,就会导致部分中文方框,怀疑是poi处理的时候,只读取第一种字体,所以导致多个中文字体乱码. 百度和谷歌都找了很久,有看到说apache官网有人说是bug,但他们回复说是字体问题,这个问题其实我觉得poi可能可以自己做,读取原来字体设置

  • Java读取properties配置文件时,出现中文乱码的解决方法

    如下所示: public static String getConfig(String key) { Properties pros = new Properties(); String value = ""; try { pros.load(new InputStreamReader(Object.class.getResourceAsStream("/properties.properties"), "UTF-8")); value = pr

随机推荐