Http目前是Internet上使用最多的协议,而HttpClient结合java能够发挥很好的功能。因此,我在解析HTML时,采用了HttpClient来完成的。
在解析HTML之前,对于乱码的问题我知之甚少。当我遇到时,真的把我难住了。因此,希望本文能够帮住大家。
下图是我做的一个小软件(该软件主要是抓取网页中的图书的信息)
遇到的第一个乱码问题(gbk与utf-8):
目前而言,HTML使用的编码大多数是utf-8,MyEclipse中控制台采用的则是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 stub
Scanner 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 stub
Scanner 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 block
e.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的作用是标识资源,标识的含义是用不同的符号标示不同的资源,以便不同的资源可互相区别。而为了在各种各样的机器上都能够输入、存储、解析和交换URI,URI只使用非常有限的字符,即ASCII字符集中的一个子集。但是,实际应用的URI往往要使用非ASCII字符,例如一个中文网页,因此,URI中可能存在汉字。对于这种情况,URI是如何处理的呢?在URI中的汉字,如采用的编码是UTF-8时,则每个汉字对应3字节,用十六进制数表示每个字节,如下图
因此,要解决此问题的话,看如下代码
String name = java.net.URLEncoder.encode("中文", "utf-8");
即引用java.net.URLEncoder中的encode方法对需要的汉字就进行转码。
由于本人第一次写技术文章,如有错误,请留言给我,谢谢。