我们项目采用的字符编码是前后台清一色的utf8,我本来以为这样子就万事大吉了,不会出什么漏子的。可是谁知道ajax传过来的中文数据还是乱码。
原来在客户端是这样的 $.get("Discrete?q"+str,function(){......});其中str中包含了中文。
在服务端我们是用servlet来监听的
String qString = new String(request.getParameter("q"));,这个qString中就有乱码。
于是到网上找了一个超诡异的解决方案,现把解决方案公布如下:
首先在js加入辅助函数:
function EncodeUtf8(s1)
{
var s = escape(s1);
var sa = s.split("%");
var retV ="";
if(sa[0] != "")
{
retV = sa[0];
}
for(var i = 1; i < sa.length; i ++)
{
if(sa[i].substring(0,1) == "u")
{
retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5)));
}
else retV += "%" + sa[i];
}
return retV;
}
function Str2Hex(s)
{
var c = "";
var n;
var ss = "0123456789ABCDEF";
var digS = "";
for(var i = 0; i < s.length; i ++)
{
c = s.charAt(i);
n = ss.indexOf(c);
digS += Dec2Dig(eval(n));
}
//return value;
return digS;
}
function Dec2Dig(n1)
{
var s = "";
var n2 = 0;
for(var i = 0; i < 4; i++)
{
n2 = Math.pow(2,3 - i);
if(n1 >= n2)
{
s += 1;
n1 = n1 - n2;
}
else
s += 0;
}
return s;
}
function Dig2Dec(s)
{
var retV = 0;
if(s.length == 4)
{
for(var i = 0; i < 4; i ++)
{
retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
}
return retV;
}
return -1;
}
function Hex2Utf8(s)
{
var retS = "";
var tempS = "";
var ss = "";
if(s.length == 16)
{
tempS = "1110" + s.substring(0, 4);
tempS += "10" + s.substring(4, 10);
tempS += "10" + s.substring(10,16);
var sss = "0123456789ABCDEF";
for(var i = 0; i < 3; i ++)
{
retS += "%";
ss = tempS.substring(i * 8, (eval(i)+1)*8);
retS += sss.charAt(Dig2Dec(ss.substring(0,4)));
retS += sss.charAt(Dig2Dec(ss.substring(4,8)));
}
return retS;
}
return "";
}
接着在填写参数的时候,在你可能会用中文的地方进行两次encodeuri
str += encodeURI(encodeURI(spot.name)) + "," + spot.latLng.lat();
接着在添加url参数的时候,做这样一个事情,"Subway?q=" + EncodeUtf8(str))。
提交到服务器后,在servlet中这样写到:
String qString = new String(request.getParameter("q"));
qString = URLDecoder.decode(URLDecoder.decode(qString, "utf-8"),"utf-8");
怎么样,很恶心吧?
后来我终于自己尝试出了一个新的更加有效的解决方案,客户端什么都不要做。只要在tomcat服务端
qString=URLDecoder.decode(URLEncoder.encode(qString,"ISO-8859-1"),"UTF-8");就可以了。
分享到:
相关推荐
在开发Web应用时,我们经常会遇到前端与后端交互的问题,特别是使用jQuery的Ajax与Servlet进行数据通信时,乱码问题是一个常见的困扰。本文将详细解释如何解决jQuery Ajax向Servlet传递参数时出现的乱码问题。 首先...
**Ajax+Servlet 实例** Ajax(Asynchronous JavaScript and XML)技术是现代Web开发中的关键组成部分,它...这个实例不仅展示了Ajax和Servlet的基本用法,还强调了在实际开发中考虑浏览器兼容性和编码问题的重要性。
本实例将探讨如何在Java后端和Ajax前端交互过程中解决字符编码问题,防止出现乱码。 在Java中,处理字符编码的关键在于正确设置输入流和输出流的编码。当接收到Ajax请求时,服务器需要正确识别请求中的编码,同时在...
### AJAX在POST中文时解决乱码的方法 #### 一、问题背景 在使用AJAX进行数据请求时,尤其是在处理中文字符的过程中,经常会遇到一个常见问题:即通过AJAX请求得到的`responseText`中的中文字符出现乱码。这个问题...
在介绍使用jQuery访问Servlet并返回数据到页面的方法前,首先我们需要了解几个重要的概念:jQuery、Servlet和Ajax。 jQuery是一个快速、小巧、功能丰富的JavaScript库,它的设计目的是让HTML文档遍历、事件处理、...
在使用jQuery的ajax()函数进行数据传输时,中文乱码问题常常困扰着开发者。这个问题主要出现在数据发送到服务器时,由于编码格式不一致导致的字符乱码。以下是一些解决此问题的方法: 方法一:使用`encodeURI()`...
实验环境 jdk8,Version: Mars Release (4.5.0) 其中有原始的以ajax方式实现html与servlet的交互 也包括了使用Jquery Ajax实现交互,包括以get方式提交时候乱码问题的处理。
### JQuery中Ajax实现 在现代Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛应用于构建响应迅速、用户体验友好的动态网页应用。通过Ajax,Web应用可以无需重新加载整个页面的情况下,仅更新部分...
通过以上步骤,Ajax请求和Servlet之间的汉字传递应该能够正常进行。在实际开发中,还需要考虑浏览器兼容性、异常处理等问题,以确保程序的健壮性。同时,对于更复杂的场景,比如上传文件或大数据量传输,可能需要...
以前在新浪博客写过js调用AJAX时Get和post的乱码解决办法,但是使用js代码比较繁琐,我们在使用ajax进行数据交互时可以使用js的一个成熟框架—jQuery。 一个网站的设计,不管是注册登录还是分页查找,都需要提交参数...
根据提供的文件信息,以下是对达内servlet/jsp/jquery培训资料中的关键知识点的详细解析: ### 1. 架构 - **C/S 架构(Client-Server 架构)**: - 客户端和服务端通过TCP/IP协议进行通信。 - 特点包括:需要...
在开发Web应用时,我们经常会遇到中文乱码问题,特别是在使用AJAX进行GET请求时。JSP中的AJAX GET请求的中文乱码问题主要是由于URL编码格式不匹配导致的。以下是一些解决此问题的关键点和步骤: 1. **URL编码格式**...
【基于Servlet的登录注册界面】是一个典型的Web应用开发实例,主要涉及到Servlet技术、数据库连接(MySQL)、前端交互(Ajax和jQuery)以及HTTP过滤器(Filter)的使用。下面将详细介绍这些知识点。 1. **Servlet**...
从给出的代码片段中,我们可以看到如何在Servlet中设置响应的编码为UTF-8,以解决中文乱码问题。在Servlet的doGet()和doPost()方法中,都调用了response.setContentType("text/html;charset=utf-8")来指定响应内容...
当使用jQuery的`$.ajax`或`$.post`发送POST请求时,可以通过`contentType`和`dataType`参数设置请求头和预期的响应类型,从而确保数据的正确编码和解码。 然而,如果你确实需要使用GET请求,并且遇到了中文乱码问题...
在Web开发中,Ajax(Asynchronous JavaScript and XML)与Servlet的交互是常见的技术,用于创建动态、无需刷新页面的...在实际项目中,还可以结合使用框架(如Spring MVC)和库(如jQuery)来简化Ajax与Servlet的交互。
为了解决AJAX回调函数返回的字符串乱码问题,开发者可以在服务器端设置响应内容类型和字符编码,以确保数据的正确传输和解析。根据提供的文件内容,这里涉及到一个关键的操作步骤: 1. 在服务器端,无论是使用...