打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
xmlhttp中文乱码的一种解决方案
userphoto

2006.09.06

关注
我们用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
};

%>
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JavaScript escape/unescape编码的Java实现
Levenshtein Distance(LD)-计算两字符串相似度算法 - chenlb...
String--常用方法列表
java代码验证身份证号码经典版
542,滑动窗口解最小覆盖子串
File,FileInputStream,FileReader,InputStreamRe...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服