论坛首页 AJAX版 JavaScript

老问题:ajax中文乱码

浏览 12220 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2006-08-08
客户端表单中文数据送往服务端时,成乱码,不管是POST还是GET,在jsp中编码改成UTF-8;SERVLET的response也改为UTF-8
   
时间:2006-08-16
ajax的乱码问题 确实是个头痛的问题..
   
0 请登录后投票
时间:2006-08-25
应该是你接受端的问题,接受之后试着做一次转码试试
   
0 请登录后投票
时间:2006-08-31
我们用Xmlhttp做无刷新的时候,如果客户端向后台jsp提交汉字,那么就会遇到,汉字编码的问题
我采用的办法是汉字在传输之前,先用javascript 的escape方法给它编码,到了jsp界面再给它解码
客户端html代码如下:

客户端
。。。。。
function saveBack(){
var zuizhdfnr= document.riseForm.zuizhdfnr.value;
var escapecode= escape(zuizhdfnr);
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
var post="<?xml version='1.0' encoding='GB2312'?><dataset><answer>"+escapecode+"</answer></dataset>";//构造携带的数据
xmlhttp.open("POST","/risenetoabjcz/bjczoa/zfrx/oa-zfrx-save.jsp",false);//使用POST方法打开服务器连接
xmlhttp.setrequestheader("content-length",post.length);
xmlhttp.setrequestheader("content-type","application/x-www-form-urlencoded");
xmlhttp.send(post);//发送数据
var res = xmlhttp.responseText;//接收服务器返回的数据
alert(res.trim());
}
。。。。。


服务器端jsp
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.io.ByteArrayOutputStream"%>
<%@ page import="java.io.IOException"%>
<%@ page import="javax.xml.parsers.DocumentBuilder"%>
<%@ page import="org.w3c.dom.Document"%>
<%@ page import="org.w3c.dom.Node"%>
<%@ page import="org.w3c.dom.NodeList"%>
<%@ page import="javax.xml.parsers.DocumentBuilderFactory"%>
<%
String answer = null;
InputStream in = request.getInputStream();
String unescapeXML = readIntoString(in);
String xmlString = unescape(unescapeXML);

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
InputStream is = new ByteArrayInputStream(xmlString.getBytes());
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
answer = getValue(doc,"answer");
.....
%>
<%!
public String readIntoString(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
for (int b = inputStream.read(); b >= 0; b = inputStream.read()) {
outputStream.write((byte) b);
}
return new String(outputStream.toByteArray());
//,"UTF-8"
//return new String(outputStream.toByteArray());
}
private String getValue(Document inXmlDoc,String tag){
NodeList nodeList = inXmlDoc.getElementsByTagName(tag);
String value = null;
Node tagNode = nodeList.item(0);
Node valueNode = tagNode.getFirstChild();
value = valueNode.getNodeValue();
return value;
}

public static String unescape(String s) {
StringBuffer sbuf = new StringBuffer();
int i = 0;
int len = s.length();
while (i < len) {
int ch = s.charAt(i);
if ('A' <= ch && ch <= 'Z') { // 'A'..'Z' : as it was
sbuf.append((char) ch);
} else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it was
sbuf.append((char) ch);
} else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it was
sbuf.append((char) ch);
} else if (ch == '-' || ch == '_' // unreserved : as it was
|| ch == '.' || ch == '!' || ch == '~' || ch == '*'
|| ch == '\'' || ch == '(' || ch == ')') {
sbuf.append((char) ch);
} else if (ch == '%') {
int cint = 0;
if ('u' != s.charAt(i + 1)) { // %XX : map to ascii(XX)
cint = (cint << 4) | val[s.charAt(i + 1)];
cint = (cint << 4) | val[s.charAt(i + 2)];
i += 2;
} else { // %uXXXX : map to unicode(XXXX)
cint = (cint << 4) | val[s.charAt(i + 2)];
cint = (cint << 4) | val[s.charAt(i + 3)];
cint = (cint << 4) | val[s.charAt(i + 4)];
cint = (cint << 4) | val[s.charAt(i + 5)];
i += 5;
}
sbuf.append((char) cint);
} else { // 对应的字符未经过编码
sbuf.append((char) ch);
}
i++;
}
return sbuf.toString();
}
private final static byte[] val = {
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F
};

%>
   
0 请登录后投票
时间:2006-10-10
我在用dojo的tree widget时,是这样处理json乱码的
一、JAVA代码中这么处理:
httpServletResponse.setContentType("text/json; charset=gb2312");
二、JSP页面头部加上:
<%@ page contentType="text/html; charset=gb2312" %>
   
0 请登录后投票
时间:2006-10-12
boogie 写道
我在用dojo的tree widget时,是这样处理json乱码的
一、JAVA代码中这么处理:
httpServletResponse.setContentType("text/json; charset=gb2312");
二、JSP页面头部加上:
<%@ page contentType="text/html; charset=gb2312" %>



同意,在返回时一定要设置编码

一般用gbk吧 gb2312 字符集小,有时候会出现?哦
   
0 请登录后投票
时间:2006-10-12
xeme 写道
一般用gbk吧 gb2312 字符集小,有时候会出现?哦

应该用gbk
   
0 请登录后投票
时间:2006-10-21
客户端传来的用
new String(s.getBytes("iso8859-1"),"gbk");

去客户端的用
String(s.toString().getBytes("gbk"),"iso8859-1");

其他的如下
response.setContentType("text/xml;charset=gbk");

<%@ page contentType="text/html; charset=utf-8" %>

我用的tomcat5.5.在IE6中可以正常显示汉字,但在mozila和Opera下则不行。
请老大们解释一下这是为什么?是tomcat还是浏览器的问题?我的IE也设置了总是以UTF-8发送URL,为什么还是以ISO8859-1处理?
   
0 请登录后投票
时间:2006-10-21
为什么大家都在搞这个问题?搜索一下过去的资料,我提一点,关键的不是转码,而是全部统一使用UTF-8编码,然后在xmlhttp Post时使用encodeXXX即可(忘了具体JS函数名)。
我试过用转码的,特别是那段VBscript的程序,有漏洞的,对于特殊字符如$,%等则会不正确。
   
0 请登录后投票
时间:2006-10-21
全部utf8下没发现什么问题。。。

包括html的保存格式,js文件保存格式,都是utf8.
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛: