`

jquery post 中文乱码解决方案

 
阅读更多

     在很多spring mvc的vm页面中,对于上传的中文文件,保存在数据库和通过java代码取出来渲染到vm页面都不会有乱码的问题,因为数据库一般是gbk编码,vm页面也一般是gbk编码:

 

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=gbk" />

</head>

这样显示是不会有乱码问题的,但是如果把这个渲染出来的中文文件文件名作为url的post或者超链接参数时,由于要对url中传递的参数进行编码,这个时候就会出乱码的问题,此时就可以采用传参时编码,然后在后台得到请求参数时解码的方式进行:

JavaScript encodeURIComponent(URIString) 函数可把字符串作为 URI 组件进行编码。参数必须是一个字符串,含有 URI 组件或其他要编码的文本。返回值中某些字符将被十六进制的转义序列进行替换。

     该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

       其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。

 

 

注意:

      encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号。

例子:

 

<script type="text/javascript">

document.write(encodeURIComponent("http://www.w3school.com.cn"))
document.write("<br />")
document.write(encodeURIComponent("http://www.w3school.com.cn/p 1/"))
document.write("<br />")
document.write(encodeURIComponent(",/?:@&=+$#"))
</script>
 

 

编码后:

 

http%3A%2F%2Fwww.w3school.com.cn
http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F
%2C%2F%3F%3A%40%26%3D%2B%24%23
 

 

 

下面是一个完成前后台编码和解码防止请求中含有中文或者特殊字符乱码的例子:

 

1.前台post请求的时候对发送的数据进行encodeURIComponent()编码:

 

 

var riskLevel= $("#riskLevelId").attr("value");
var riskDesprition=encodeURIComponent($("#riskDescriptionId").html());
var modifySuggest=encodeURIComponent($("#modifySuggest").val());
 $.post(
       "${path}/executeSaveOperate.action",
      {"riskLevel":riskLevel,"riskDesprition":riskDesprition,"modifySuggest",modifySuggest},
      function(data){
        if(data=='1'){
           alert("保存成功!");
           
          }else{
           alert("保存失败!");
        }
});
 

后台:用UTF-8转译:

 

		String riskLevel = URLDecoder.decode(request.getParameter("riskLevel"),
				"UTF-8");
		String riskDesprition = URLDecoder.decode(
				request.getParameter("riskDesprition"), "UTF-8");
		String modifySuggest = URLDecoder.decode(
				request.getParameter("modifySuggest"), "UTF-8");
 

即可解决jQuery post请求中文乱码问题。

 

一:但是ava.net.URLEncoder编码特点

 这样有一个小问题,就是在解码的时候由于采用的是java的一个类java.net.URLEncoder,

这个类是把一个string转换为application/x-www-form-urlencoded MIME 的格式,他的解码方式是:1.'a'--'z','A'--'Z'和'0'--'9'保持原样 。

       2. 特殊字符:".", "-", "*"和"_"保持原样。

      3. 空格 " "被转换成一个加号 "+"。

     4. 所有的其他字符包括汉字,被首先转换成字节数组,然后每一个字节以三字符形式表示的十六进制方式“%xy”,其中xy是2个数字形式的十六进制表现方式,建议是用“UTF-8”进行编码,如果没有指定,就以默认方式编码。

例如:"The string ü@foo-bar"编码后为: "The+string+%C3%BC%40foo-bar"

ü is 编码为两字节的 C3 (hex) and BC (hex)。

 

所以,含有空格的字符串进行编码和解码时就多了一个“+”号,而“+”号在html页面中时不能解析转码的 ,所以在下载中文文件时为了文件名不乱码,需要特殊处理下:

 

 

		response.setContentType("application/x-msdownload;charset='UTF-8'");

			//html页面不能把utf解析出的"+"号进行转码,也就是不识别+号,所以要进行转码
		response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(("riskm_"
				+ arkUser+"_" + fileName), "UTF-8").replaceAll("\\+", "%20"));
 

URLEncoder一般是在java代码中,也就是后天进行编码,这样通过response把数据发送到客户端进行解码是就不会乱码,比如说下载文件时,文件名是中文,有空格,点击下载时,在弹出的windows保存框中的文件名就是通过服务器response发送过来的,如果不进行编码直接发送过来有时就会出现乱码的情况。

    这种编码方式, 在URL中使用的字符就必须是一个ASCII字符集的固定字集中的元素。

      / & ? @ # ; $ + = 和 %也可以被使用,但是它们各有其特殊的用途,如果一个文件名包括了这些字符( / & ? @ # ; $ + = %),这些字符和所有其他字符就应该被编码。

例子1:

这段代码对其进行编码:
String query = URLEncoder.encode( "pg=q&kl=XX&stype=stext&q=+\"Java+I/O\"&search.x=38&search.y=3");System.out.println(query);

不幸的是,得到的输出是:
pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

出现这个问题就是方法URLEncoder.encode( ) 在进行盲目地编码。它不能区分在URL或者查询string中被用到的特殊字符(象前面string中的“=”,和“&”)和确实需要被编码的字符。由此,所以URL需要像下面这样一次只编码一块:

String query = URLEncoder.encode("pg");
query += "=";
query += URLEncoder.encode("q");
query += "&";
query += URLEncoder.encode("kl");
query += "=";
query += URLEncoder.encode("XX");
query += "&";
query += URLEncoder.encode("stype");
query += "=";
query += URLEncoder.encode("stext");
query += "&";
query += URLEncoder.encode("q");
query += "=";
query += URLEncoder.encode("\"Java I/O\"");
query += "&";
query += URLEncoder.encode("search.x");
query += "=";
query += URLEncoder.encode("38");
query += "&";
query += URLEncoder.encode("search.y");
query += "=";
query += URLEncoder.encode("3");
System.out.println(query);

这才是你真正想得到的输出:
pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

例子2:

一个QueryString类。在一个java对象中,它使用了类URLEncoder来编码连续的属性名和属性值对,这个java对象被用来发送数据到服务器端的程序。

当你在创建一个QueryString对象时,你可以把查询string中的第一个属性对传递给类QueryString的构造函数,得到初始string。如果要继续加入后面的属性对,就应调用方法add(),它也能接受两个string作为参数,能对它们进行编码。方法getQuery( )返回一个属性对被逐个编码后得到的整个string。

Example :The QueryString class
package com.macfaq.net;

import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;

public class QueryString {
  private StringBuffer query = new StringBuffer();

public QueryString(String name, String value) { 
  encode(name, value);
}


public synchronized void add(String name, String value) {
  query.append('&');
  encode(name, value);
}

private synchronized void encode(String name, String value) {
  try {
    query.append(URLEncoder.encode(name, "UTF-8"));
    query.append('=');
    query.append(URLEncoder.encode(value, "UTF-8"));
} catch (UnsupportedEncodingException ex) {
     throw new RuntimeException("Broken VM does not support UTF-8");
}
}

public String getQuery() {
  return query.toString();
}

public String toString() {
  return getQuery();
}
}

利用这个类,现在我们就能对前面那个例子中的string进行编码了:
QueryString qs = new QueryString("pg", "q");
qs.add("kl", "XX");
qs.add("stype", "stext");
qs.add("q", "+\"Java I/O\"");
qs.add("search.x", "38");
qs.add("search.y", "3");
String url = "http://www.altavista.com/cgi-bin/query?" + qs;
System.out.println(url);

 

二:

   与URLEncoder 类相对应的URLDecoder 类有两种静态方法。它们解码以x-www-form-url-encoded这种形式编码的string。也就是说,它们把所有的加号(+)转换成空格符,把所有的%xx分别转换成与之相对应的字符:
public static String decode(String s) throws Exception
public static String decode(String s, String encoding) // Java 1.4 throws UnsupportedEncodingException

 

    第一种解码方法在java1.3和java1.2中使用。第二种解码方法在java1.4和更新的版本中使用。最好选择UTF-8解码。它比其他任何的编码形式更有可能得到正确的结果。

   如果string包含了一个“%”,但紧跟其后的不是两位16进制的数或者被解码成非法序列,该方法就会抛出IllegalArgumentException 异常。当下次再出现这种情况时,它可能就不会被抛出了。这是与运行环境相关的,当检查到有非法序列时,抛不抛出IllegalArgumentException 异常,这时到底会发生什么是不确定的。在Sun's JDK 1.4中,不会抛出什么异常,它会把一些莫名其妙的字节加进不能被顺利编码的string中。这可能就是一个安全漏洞

 

由于这个方法没有触及到非转义字符,所以你可以把整个URL作为参数传给该方法,不用像之前那样分块进行。例如:
  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"; 
  try { 
  String output = URLDecoder.decode(input, "UTF-8"); 
  System.out.println(output); 
  }

 

 

分享到:
评论

相关推荐

    jQuery中文乱码

    ### jQuery中文乱码完美解决方案 在处理Web应用中,尤其是涉及到多语言环境时,中文乱码问题时常困扰着开发者。本文将深入探讨jQuery在处理中文数据时遇到的乱码问题,并提供一系列有效的解决方案。 #### 一、理解...

    Ajax中文乱码问题解决方案

    本文将深入探讨Ajax中文乱码问题的成因,并提供一系列解决方案。 **一、问题原因** 1. **编码格式不一致**:服务器与客户端(浏览器)之间使用的字符编码格式不同,例如服务器使用GBK编码,而浏览器使用UTF-8编码...

    JQuery AJAX提交中文乱码的解决方案

    为了解决这个问题,作者提出了一种解决方案,即在AJAX请求中显式地指定字符集为UTF-8。在JQuery的AJAX工具函数中,可以通过options参数来指定content-type,也就是在请求中设置HTTP头的Content-Type字段。例如: ``...

    Ajax乱码解决方案

    ### Ajax乱码解决方案 在进行Ajax开发的过程中,经常会遇到数据编码问题导致的乱码现象。这类问题虽然看似简单,但若处理不当,则可能耗费大量时间进行调试与解决。本文将结合一个具体的案例来探讨如何有效地解决...

    escape --AJAX和JS传中文乱码的最终解决方案

    本文将深入探讨如何使用"escape"函数以及相关的编码策略来解决AJAX和JS传中文乱码的问题。 首先,我们需要理解AJAX(异步JavaScript和XML)的工作原理。AJAX允许网页在不重新加载整个页面的情况下与服务器交换数据...

    jQuery ajax方法传递中文时出现中文乱码的解决方法

    本文将详细解释这个问题,并提供有效的解决方案。 首先,我们要理解AJAX(Asynchronous JavaScript and XML)的核心是通过XMLHttpRequest对象与服务器进行异步数据交换。当传递包含中文字符的数据时,如果编码处理...

    ASP.NET jquery.uploadify文件上传控件测试项目(已解决中文乱码)

    ASP.NET 是微软开发的一种Web应用程序框架,用于构建动态、数据驱动的网站。在这个项目中,我们关注的是jQuery.uploadify插件,...这个测试项目提供了一个完整的解决方案,对遇到类似问题的开发者有着很高的参考价值。

    JQuery 传送中文乱码问题的简单解决办法

    在使用JQuery进行数据传输时,中文乱码问题是一个比较常见的难题。...两种方法各有优劣,可以根据实际情况和需求选择适合的解决方案。在开发过程中,确保字符编码的一致性和正确性,是避免中文乱码的关键所在。

    jquery中文乱码的多种解决方法

    ### (一)使用$.ajax出现的中文乱码解决方案 #### 1. 修改contentType属性 **问题描述**: 当使用`dataUrl`方式提交数据时(即通过字符串拼接的方式设置请求体),无论前台使用哪种编码方式(如`encodeURI`、`...

    AJAX在Post中文的时候解决乱码的方法

    #### 三、解决方案 为了解决AJAX请求中中文乱码的问题,可以通过以下两种方式来进行: 1. **在服务器端设置正确的字符集**: - **PHP**:可以使用`header()`函数来设置响应头中的字符集,例如: ```php header...

    JQuery的Ajax中Post方法传递中文出现乱码的解决方法

    在使用JQuery的Ajax进行POST请求时,遇到中文参数出现乱码的问题,通常是由于字符编码不一致导致的。本文主要探讨两种解决方案。 首先,我们来分析问题一。在使用GET方式传递中文参数时,设置页面编码为GB2312可以...

    如何解决JQuery ajaxSubmit提交中文乱码

    以下是对这个问题的深入解析和解决方案。 首先,`ajaxSubmit`是JQuery Form插件中的一个方法,它允许我们方便地实现异步表单提交。在默认情况下,JQuery会使用`encodeURIComponent`函数对表单数据进行编码,确保...

    jquery向.ashx文件post中文乱码问题的解决方法

    本文主要讨论如何解决jQuery向.ASHX文件POST中文数据时出现的乱码问题。 首先,问题的背景是在Visual Studio 2005环境下,由于未安装SP1补丁,只能创建网站项目,使用的是jQuery 1.5.1版本。当尝试向.ASHX处理程序...

    jquery乱码与contentType属性设置问题解决方案

    在 jQuery 中,乱码问题通常出现在数据的发送(POST)和接收(GET)过程中,尤其是涉及中文字符时。以下是对这个问题的详细分析和解决方案: 首先,jQuery 的 contentType 属性是一个关键设置,它定义了发送到...

    jQuery发请求传输中文参数乱码问题的解决方案

    本文将深入探讨这个问题的原因,并提供有效的解决方案。 首先,我们要理解为什么会出现中文乱码。当使用jQuery的`$.get()`方法进行GET请求时,浏览器会自动对URL中的参数进行URL编码(Percent-Encoding)。这种编码...

    response响应数据变成???&使用jquery发送带中文参数数据的get请求得到响应数据乱码解决过程

    然而,如果你确实需要使用GET请求,并且遇到了中文乱码问题,可以尝试以下解决方案: 1. 对URL中的中文参数进行URL编码(使用JavaScript的`encodeURIComponent()`函数)。 2. 在服务器端接收请求时,解码URL参数...

    json中文乱码

    本篇文章将详细探讨这一问题,并提供相应的解决方案。 #### 二、JSON中文乱码原因分析 1. **前端编码与后端编码不一致**:最常见的原因是前端页面和后端服务器的字符集设置不同,例如前端使用UTF-8而后端使用GBK。...

    ajax获取数据中文乱码问题最简单的完美解决方案

    使用scriptCharset即可解决...上面的解决方案是最完美的,另外也附上网上的解决方式吧,是用contentType来处理的 代码如下: jQuery(form).ajaxSubmit({ url: “ajax.aspx?a=memberlogin”, type: “post”, dataTyp

    jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法

    在使用jQuery进行Web开发过程中,表单序列化是一项...希望上述解决方案能够对使用jQuery进行Web开发的朋友们有所帮助。如果有任何疑问或需要进一步的技术支持,请及时留言反馈,小编将会尽快回复解答,谢谢大家的支持。

Global site tag (gtag.js) - Google Analytics