HttpClient_002_中文乱码、HttpClient中文乱码透析、总结
中文乱码原理代码:
String s = "中文"; byte[] bs2 = s.getBytes("utf-8");//将s拆成:utf-8个体,注:utf-8指s原本就是utf-8 String s1 = new String(bs2,"iso-8859-1");//将bs2组装成:iso-8859-1串 String s2 = new String(bs2,"utf-8");//将bs2组装成:utf-8串 String s3 = new String(s1.getBytes("iso-8859-1"),"utf-8");//将s1拆成iso-8859-1串,然后组装成utf-8 System.out.println(s1+"\n"+s2+"\n"+s3);
结果:
??????
中文
中文
实例源码下载:http://download.csdn.net/detail/poiuy1991719/8594485
解决HttpClient中文乱码,项目演示:
1:编写httpClient_001
所需包:
1、1:编写URLUtil类
package com.west.test.httpclient; public class URLUtil { public static final String HttpClient_002="http://localhost:8080/httpClient_002/";//访问本地项目2路径 public static final String POST_CONTENT=HttpClient_002+"PostContent"; }
1、2:编写Servlet类
package com.west.test.httpclient; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import javax.servlet.ServletException; public class PostServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("========httpClient_001 PostServlet start========="); System.out.println("httpClient_001:doPost方式提交"); HttpClient httpClient = new HttpClient(); PostMethod method = new PostMethod(URLUtil.POST_CONTENT); // 解决中文乱码(设置:"我方"HttpClient提交、解析所用码) method.getParams().setContentCharset("utf-8"); String charset=method.getParams().getContentCharset(); NameValuePair name = new NameValuePair("name", "张三"); NameValuePair password = new NameValuePair("password", "password:123321"); method.setRequestBody(new NameValuePair[] { name, password }); String rt = ""; try { int status = httpClient.executeMethod(method); if (status == HttpStatus.SC_OK) { rt = method.getResponseBodyAsString(); System.out.println("httpClient_001得到:" + rt); codeTest(rt,charset); } } catch (Exception e) { e.printStackTrace(); System.out.println("网络连接失败,请联系管理员!"); } // 释放HttpClient资源 method.releaseConnection(); outMessage(response, rt); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("httpClient_001:doGet方式提交"); doPost(request, response); } public void outMessage(HttpServletResponse response, String message) { try { // 解决"界面"中文乱码(设置:"我方"提交所用码、"对方"解析所用码) response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.print(message); out.close(); } catch (IOException e) { e.printStackTrace(); } } public void codeTest(String rt ,String charset) throws Exception { System.out.println("得到的是:"+charset); byte[] btr=rt.getBytes(charset); String rt01 = new String(btr, "iso-8859-1"); System.out.println("String(btr,'iso-8859-1')转码01:" + rt01); String rt02 = new String(btr, "utf-8"); System.out.println("String(btr,'utf-8')转码02:" + rt02); String rt03 = new String(rt01.getBytes("iso-8859-1"), "utf-8"); System.out.println(rt03); } }
1.3:配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>test</display-name> <servlet> <servlet-name>PostServlet</servlet-name> <servlet-class>com.west.test.httpclient.PostServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>PostServlet</servlet-name> <url-pattern>/PostServlet</url-pattern> </servlet-mapping> <session-config> <session-timeout>600</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
1、3:编写界面:index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>test</title> </head> <body> <form action="PostServlet" method="post"> <input type="submit" value="Post提交"> </form> </body> </html>
2:编写项目:httpClient_002
2、1:编写Servlet类
package com.test.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PostContent extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("=========httpClient_002 PostContent start============"); System.out.println("httpClient_002:doPost方式执行"); // 解决中文乱码(设置:"我方"解析所用码) request.setCharacterEncoding("utf-8"); String name = request.getParameter("name"); String password = request.getParameter("password"); System.out.println("httpClient_002得到:{name:" + name+",password:"+password+"}"); String reStr = "{name=" + name + ",password=" + password+"}"; outMessage(response, reStr); } public void outMessage(HttpServletResponse response, Object message) { try { // 解决中文乱码(设置:"我方"提交所用码,"httpClient_001"解析所用码) response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.print(message); out.close(); } catch (IOException e) { e.printStackTrace(); } } }
2.2:配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>test002</display-name> <servlet> <servlet-name>PostContent</servlet-name> <servlet-class>com.test.servlet.PostContent</servlet-class> </servlet> <servlet-mapping> <servlet-name>PostContent</servlet-name> <url-pattern>/PostContent</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> </welcome-file-list> </web-app>
3:总结
1、解决中文乱码(设置:"我方"HttpClient提交、解析所用码) method.getParams().setContentCharset("utf-8"); 2、解决"界面"中文乱码(设置:"我方"提交所用码、"对方"解析所用码) response.setContentType("text/html;charset=utf-8"); 3、解决中文乱码(设置:"我方"解析所用码) request.setCharacterEncoding("utf-8"); 4、解决中文乱码(设置:"我方"提交所用码、"httpClient_001"解析所用码),同2 response.setContentType("text/html;charset=utf-8");
附加:
请求网页、servlet:
GetMethod getMethod = new GetMethod("http://www.baidu.com"); //(1)、这里可以设置自己想要的编码格式 getMethod.getParams().setContentCharset("utf-8"); //(2)、对于get方法也可以这样设置 getMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"GB2312"); //(3)、还可以如下这样设置 getMethod.addRequestHeader("Content-Type", "text/html; charset=UTF-8"); //(4)、当然同样可以直接设置 httpClient 对象的编码格式 HttpClient httpClient = new HttpClient(); httpClient.getParams().setContentCharset("utf-8"); //使用流的方式读取也可以如下设置 InputStream in = getMethod.getResponseBodyAsStream(); //这里的编码规则要与上面的相对应 BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));
请求方法、servlet:
PostMethod PostMethod= new PostMethod("http://localhost:8080/ezid-cert-mobile/upload"); //(1)、通常可以如下设置自己想要的编码格式 postMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8"); //(2)、也重载PostMethod的getRequestCharSet()方法 public class UTF8PostMethod extends PostMethod{ public UTF8PostMethod(String url){ super(url); } @Override public String getRequestCharSet() { return "UTF-8"; } } //(3)、如果是方法的参数出现乱码问题,那么你可以如下设置参数 Charset utf8Charset = Charset.forName("UTF-8"); multipartContent.addPart("name", new StringBody(Info.getUserEntity().getName(), utf8Charset)); //(4)、如果你用的是Part [] parts={...}传参方式的话可以如下设置 StringPart name=new StringPart("name",certFormEntity.getPersonName(), "UTF-8");