用HttpClient解析HTML时遇到的乱码问题

来源:互联网 发布:猴博士爱讲课知乎 编辑:程序博客网 时间:2024/06/06 03:51

Http目前是Internet上使用最多的协议,HttpClient结合java能够发挥很好的功能。因此,我在解析HTML时,采用了HttpClient来完成的。

在解析HTML之前,对于乱码的问题我知之甚少。当我遇到时,真的把我难住了。因此,希望本文能够帮住大家。

下图是我做的一个小软件(该软件主要是抓取网页中的图书的信息

遇到的第一个乱码问题(gbkutf-8):

             目前而言,HTML使用的编码大多数是utf-8MyEclipse中控制台采用的则是GBK。而我的MyEclipse的编码采用的则是utf-8

       因此当我运行下例代码时的运行情况:

package com.cqcet.test;import java.io.UnsupportedEncodingException;import java.util.Scanner;public class codeprob {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubScanner read = new Scanner(System.in);System.out.println("请输入关键字:");String str = read.nextLine();System.out.println(str);}}

当我输入“中国人”时:

下面给出解决方法

package com.cqcet.test;import java.io.UnsupportedEncodingException;import java.util.Scanner;public class codeprob {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubScanner read = new Scanner(System.in);System.out.println("请输入关键字:");String str = read.nextLine();try {System.out.println(new String(str.getBytes("gbk"),"utf-8"));} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

再看结果:


       转码到成功了,但为什么最后一个汉字是问号呢?

       因为java是以gbk方式解码的,因此,如果一对汉字字节不符合gbk编码规范,则每个字节使用‘?’(ascii 63)代替,即当汉字字符串最一位是奇数时,则变成问号。(大家可以尝试下)



遇到第二个乱码问题(获取HTML页面时

       因为http://222.180.192.5:8989/opac2/open/是采用utf-8,如下图

             

       MyEclipse代码默认编码则是GBK,因此,当我把解析的数据数据时,如下图

             

       如果把设置为utf-8,解析数据如下图

             


       因此,在做代码开发时,一定要把编码设置好



遇到第三个乱码问题(URI中的关键字不能出现中文

       什么是URI中的关键字不能出现中文?如下图

private static String uri = "http://222.180.192.5:8989/opac2/open/searchResults.htm?action=simpleSearch&bookType=0&location=&key=中文¤tPage=0";


       如果URI中的关键字出现中文后,会出现什么情况呢?如下图


       对,就是报异常了,为什么会出现报异常了呢?经过我多次百度,终于弄懂了它。

现在我们来分析下:

       URI的作用是标识资源,标识的含义是用不同的符号标示不同的资源,以便不同的资源可互相区别。而为了在各种各样的机器上都能够输入、存储、解析和交换URIURI只使用非常有限的字符,即ASCII字符集中的一个子集。但是,实际应用的URI往往要使用非ASCII字符,例如一个中文网页,因此,URI中可能存在汉字。对于这种情况,URI是如何处理的呢?在URI中的汉字,如采用的编码是UTF8时,则每个汉字对应3字节,用十六进制数表示每个字节,如下图

因此,要解决此问题的话,看如下代码

String name = java.net.URLEncoder.encode("中文", "utf-8");
即引用java.net.URLEncoder中的encode方法对需要的汉字就进行转码。

由于本人第一次写技术文章,如有错误,请留言给我,谢谢。



0 0
原创粉丝点击