论坛首页 AJAX版 AJAX

xmlhttp中文乱码的一种解决方案

浏览 5384 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (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());
}

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
};

%>
   
时间:2006-09-13
我们的做法是直接用Javascript对内容进行UTF-8编码,Server只要把字符集设成UTF-8就可以了,无需额外处理
   
0 请登录后投票
时间:2006-10-18
客户端页面,可以设置charset为utf8,最好了。
   
0 请登录后投票
时间:2007-01-19
alang 写道
客户端页面,可以设置charset为utf8,最好了。


这样作的花客户端就不能直接写中文了,必须用 label,message那些东西了好像
   
0 请登录后投票
时间:2007-01-20
alang 写道
客户端页面,可以设置charset为utf8,最好了。


前台显示还是用GBK,在后台处理用UTF-8字符集就行,我在Ajax结合Struts就是这样简单实现的
   
0 请登录后投票
时间:2007-02-16
关于编码,建议都用UTF-8。方便又统一,搞两套反而不好。
不然,嘿嘿,万一哪天冒个法文。你估计就要咬牙切齿了。
   
0 请登录后投票
时间:2007-03-20
个人认为用utf-8确实是最好的办法.
   
0 请登录后投票
时间:2007-03-21
对内容进行UTF-8编码,用gb2312 简体中文不支持 "©"等符号
   
0 请登录后投票
时间:2007-05-05
嗯嗯~~前段搞jsp也出现这问题,utf-8搞定的
   
0 请登录后投票
时间:2007-06-07
UTF-8可以搞定的。
   
0 请登录后投票
论坛首页 AJAX版 AJAX

跳转论坛: