最后网站测试,使用PrintWriter没有出现乱码。代码如下:
Java代码
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class TestSocket {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
DataOutputStream dos = null;
PrintWriter pw = null;
BufferedReader in = null;
String responseXml = "要传输的中文";
//..........
dos = new DataOutputStream(socket.getOutputStream());
pw = new PrintWriter(new OutputStreamWriter(dos)); //不带自动刷新的Writer
pw.println(responseXml);
pw.flush();
}
}
需要注意的方面是,需要使用PrintWriter的println而不是write方法,否则服务器端会读不到数据的。原因就是println会在输出的时候在字符串后面加一个换行符,而write不会。
4.JSP中显示中文的乱码。
有的时候JSP页面在显示中文的时候会有乱码,大多数情况就是字符集配置和页面编码的问题。只要保证如下的几个配置没有问题,一般就不会有乱码出现。
a.JSP页面顶端添加如下语句:
Java代码
<%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %>
b.在HTML的head标签中添加如下语句。
Java代码
c.保证JSP的页面编码与上面两个的charset相同,这点我有在文章的第一点说过。
上面的字符集可以根据需要自己灵活选择,不一定非要utf-8。不过因为utf-8对各国语言,特别是中文支持较好,所以推荐使用。我就曾经遇到过 在GB2312编码的页面无法正常显示的问题。
5.Post和Get传递中文,后台获取乱码。
前台传递中文也分为Get和Post方法。
a.Get方法的情况:
Get方法的时候主要是URL传递中文。
如果是在js文件中,可以使用如下代码进行中文转码。
Js代码
var url ="http://www.baidu.com/s industry=编码"
url = encodeURI(url);
如果是在jsp文件中,则可以使用如下语句进行转码。
页面开始引入:
Java代码
<%@ page import="java.net.URLEncoder" %>
需要转码的地方使用URLEncoder进行编码:
http://www.baidu.com/s wd=编码", "UTF-8")%>">
无论使用哪种方法,在后台获取中文的时候都要使用如下代码:
Java代码
request.setCharacterEncoding("utf-8");
String industry = new String(
request.getParameter("industry ").getBytes("ISO8859-1"),"UTF-8");
【注】
1.对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,为了统一,需要提交指定传输编码。
2.上面代码的第二句好像和第2条中给出的公式矛盾。我也纠结了好久,最后发现ISO8859-1是一种比较老的编码,通常叫做Latin-1,属于单字节编码,正好和计算机最基础的表示单位一致,因此使用它进行转码一般也没有问题。
iso-8859-1是JAVA网络传输使用的标准字符集,而gb2312是标准中文字符集,当你作出提交表单等需要网络传输的操作的时候,就需要把 iso-8859-1转换为gb2312字符集显示,否则如果按浏览器的gb2312格式来解释iso-8859-1字符集的话,由于2者不兼容,所以会是乱码。为了省事,建议统一使用utf-8字符集。
b.POST方法的情况。
对于Post的情况就比较简单了,只需要在post的函数调用部分,制定post的header的字符集,如:
Js代码
xmlHttp.open("post", url , true);
xmlHttp.setRequestHeader("Content-Type","text/xml; charset= utf-8");
xmlHttp.send(param);
其中param为要传递的参数。
后台部分和get方法一样,设置如下即可,注意传输和接受的字符集要统一。
6.后台向前台传递中文乱码。
在这里提供一个函数,通过这个函数来发送信息,就不会出现乱码,核心思想也是设置response流的字符集。函数代码如下:
Java代码
/**
* @Function:writeResponse
* @Description:ajax方式返回字符串
* @param str:json
* @return:true:输出成功,false:输出失败
*/
public boolean writeResponse(String str){
boolean ret = true;
try{
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.print(str);
pw.close();
}catch (Exception e) {
ret = false;
e.printStackTrace();
}
return ret;
}
7.下载文件时文件名乱码。
下过下载的人都知道下载的文件容易出现乱码,原因也是没有对输出流的编码格式进行限定。
附上一段代码,用来帮你完成无乱码下载。
Java代码
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
response.res