zoukankan      html  css  js  c++  java
  • 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+"
    "+s2+"
    "+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");
  • 相关阅读:
    无U盘安装Linux openSUSE(通过硬盘安装Linux)
    【汇编语言】DEBUG的使用
    【汇编语言】新手第一步——HelloWorld & A+B
    Java开发中的23种设计模式详解(转)
    python安装PIL包的方法
    python正则表达式匹配十六进制数据
    mysql安装的坑
    pdfplumber解析PDF报错:ValueError: not enough values to unpack (expected 2, got 1)
    pdfplumber解析票据PDF文档,部分中文字体返回CID,无法解析
    CAN总线字节序
  • 原文地址:https://www.cnblogs.com/zjsy/p/4441255.html
Copyright © 2011-2022 走看看