我主要针对IE和FF进行讨论,google的chorme和IE相近。
首先解释几个字符集转码的只是要点已方便后面阐述。
1.java平台在JVM中运行的字符串为unicode,jsp或servlet的getParamter方法将传进来的不管什么编码的字符串都以ISO-8859-1编码转成unicode,在输出时在使用ISO-8859-1转回输出,这样在程序开发中不会出现乱码,但在web开发中就非常容易出现乱码
2.在ajax传输中文字符是,FF和IE所采用的机制是不同的,FF是将所有的字符自动转化成utf-8再进行传输,而在接受字符串是先从头部获取字符集类型,如果没有在判断<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />中的 字符集类型,而IE恰恰相反,在ajax传中文时,使用平台默认字符集,中文平台的话一般式是GBK,而在接受字符串是先判读<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /中的字符集,在判读头部信息中的字符集类型
好了,这两点理解以后,下面解释起来就方便了。
(1)encodeURI:在IE和Chrome中,ajax发送的是平台默认的字符编码GBK,通过encodeURI将GBK和一些特殊字符转换成utf-8(想了解encodeURI的转化详情,可以看我前一篇blog),而在FF中,发送的编码默认为utf-8,所以GBK的编码有FF自动转为utf-8并进行发送,对utf-8编码调用encodeURI方法,则不会改变字符的编码(因为它已经是utf-8了,再编一次也一样)
(2)一般在服务器端会自动对传入的字符串进行url解码
(3)request.getParameter方法又使字符串用ISO-8859-1解码
(4)使用String.getByte("ISO-8859-1")编码为字节数组
(5)在使用new Stirng(str,"utf-8")解码为unicode,然后就可以在JVM中处理了,和一般在程序中创建的字符串一样了
(6)如果你使用System.out.print输出的话,JVM回根据OS默认字符集编码输出
(7)如果你要输出到html中的话,为了各平台的兼容性,使用response.setCharacterEncoding设置头部字符集,在html页面中也使用<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />指定页面编码
说到这里,整个过程大概就是这样了,下面show一下code,来作为这篇文章的结尾把
html:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>My JSP 'MyJsp.jsp' starting page</title>
</head>
<script type="text/javascript">
function createXHR(){
var request;
try{
request = new ActiveXObject('Msxml2.XMLHTTP');
}catch(e){
try{
request = new ActiveXObject('Microsoft.XMLHTTP');
}catch(e){
try{
request = new XMLHttpRequest();
}catch(e){
alert('创建XMLHttpRequest失败');
return null;
}
}
}
return request;
}
</script>
<script type="text/javascript">
var xmlHttp = createXHR();
var url = 'servlet/HandleServlet?name=胡乐费';
if(xmlHttp != null){
xmlHttp.open('GET',encodeURI(url),true);
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);
}else{
alert('创建失败');
}
function updatePage(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
alert(xmlHttp.responseText);
}
}
}
</script>
<body>
<input type="button" name="btn" value="send" />
</body>
</html>
服务器端servlet:
package com.mst.im;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HandleServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");
response.setContentType("text/plain; charset=GBK");
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"utf-8");
System.out.println(name);
PrintWriter out = response.getWriter();
out.print(name);
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
最后注明,此篇文字为胡乐费所有,如需转载,请注明作者,尊重知识产权,谢谢!!!!
分享到:
相关推荐
Ajax中文乱码问题解决方案
Ajax跨域问题及其解决方案.docx
关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域只是...o表现(整理了一些遇到的问题以及解决方案) 如何解决ajax跨域 oJSONP方式 oCORS方式 o代理请求方式 如何分析ajax跨域 ohttp抓包的分析 o一些示例
ajax乱码问题.ajax乱码问题的一些解决方案,总结网友的一些方法。
ajax传输xml
在前台通过动态添加script标签及src属性,表面看上去与ajax极为相似,但是,这和ajax并没有任何关系;为了便于使用及交流,逐渐形成了一中非正式传输协议,人们把它称作 jsonp 。 代码如下: html: <body> ...
ajax传输js ajax传输js ajax传输js ajax传输js ajax传输js ajax传输js
在开发AJAX过程中遇到的问题及解决方案,浏览器缓存的问题。
介绍了AJax中传输数据的一种新形式:JSON
NULL 博文链接:https://exceptioneye.iteye.com/blog/1405495
.net中ajax学习解决方案,很好地代码程序,供大家参考
主要介绍了Ajax传输中文乱码问题的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
主要介绍了JavaScript读二进制文件并用ajax传输二进制流的方法的相关资料,需要的朋友可以参考下
前端利用ajax请求传输json串出错
json.js and json.jar 博文链接:https://terran-li2008.iteye.com/blog/199088
-include // 提供ajax接口 -model // 案例中实现的一个接口 -comm.js // javascript -config.js // js 配置页面 -config.inc.php // php 配置页面 -test.php // 测试页面 -do.php // 处理页面
ajax提交时,后台接收的参数出现中文乱码的解决方法,
ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8", 修改了jquery.js,添加了charset=utf8之后ajax就能传输文佬参数过去后台
详细介绍了使用ajax如何兼容各种浏览器