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

所需包:

HttpClient_002_中文乱码、HttpClient中文乱码透析、总结

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");

 

你可能感兴趣的:(httpclient)