编码

来源:互联网 发布:猫咪益生菌 知乎 编辑:程序博客网 时间:2024/06/05 21:14

1.编码:字符串转换为字节数组

   编码:字节数组转换为字符串

   各种编码表用于表示字符的字节位数不一样,导致编解码时若指定码表不一致就会出现乱码,而英文在所有的编码中所占字节数都一样,故不会产生乱码情况。下面重点讨论中文乱码的解决。

2.web服务中,tomcat默认的编码方式一般是ISO-8859-1,而此编码使用一个字节的8位进行表示,中文一般占两个字节,最多占三个字节,所以会出现中文乱码。

   示例代码如下:通过sendPost方法向服务端使用utf-8编码发送请求,服务端指定utf-8编码解析发送的指定parameter,若是是不指定编码就会出现乱码。

1服务端代码:

public class CodeServlet extends HttpServlet {
private static final long serialVersionUID = -4358266850437306781L;


@Override
public void service(ServletRequest req, ServletResponse resp)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)(req);
HttpServletResponse response = (HttpServletResponse)(resp);
request.setCharacterEncoding("utf-8");     //底层以流的形式写入,客户端指定编码utf-8,解码也为utf-8
String content = request.getParameter("method");
// request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// response.setContentType("text/html;charset=utf-8");//指定浏览器以utf-8进行解码,
response.getWriter().println("你好,这是输出的中文数据");
}
}

(2)客户端代码:
public class HttpRequestUtil {


/**
* 向指定URL发送GET方法的请求

* @param url
*            发送请求的URL
* @param param
*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应,可以指定 
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}


/**
* 向指定 URL 发送POST方法的请求

* @param url
*            发送请求的 URL
* @param param
*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流,指定输出流为utf-8,否则服务端接收为乱码
out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
public static void main(String[] args) {
String a = sendPost("http://localhost:8080/TestWeb/","method=nihao,这是我发的第二句中文");
System.out.println(a);
}


}

0 0