要读取网页www.bnu.edu.cn的内容,用以下两种方式读取,第一种显示正常,第二种却总是乱码。请问第二种的读取问题出在了哪里?
方法一:
String url = "http://www.bnu.edu.cn";//www.bnu.edu.cn"; URL theUrl= new URL(url); openStream = theUrl.openStream(); //<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> //构建输入流的的字符集必须和HTML源码中的 charset一致 bf = new BufferedReader(new InputStreamReader(openStream,"utf-8")); String line = null; while((line = bf.readLine())!=null) { System.out.println(line); }
方法二:
Socket webClient = new Socket ("www.bnu.edu.cn", 80); PrintWriter result = new PrintWriter(webClient.getOutputStream(), true); BufferedReader receiver = new BufferedReader (new InputStreamReader(webClient.getInputStream())); result.println("GET / HTTP/1.1"); result.println("Host: bnu.edu.cn"); result.println("Connection: Close"); result.println(); boolean bRet = true; StringBuffer sb = new StringBuffer (8096); while (bRet) { if (receiver.ready()) { int idx = 0; while (idx!=-1) { idx = receiver.read(); sb.append((char)idx); } bRet = false; } } byte [] b = (sb.toString()).getBytes("UTF-8");//"GBK", "ISO-88591-1"; String str = new String(b,"GB2312"); System.out.println(str); webClient.close();
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
sb.toString() 应该已经 默认转了一次码了吧
如果不是Linux 系统 ,这里就应该已经乱码了 然后在 .getBytes("UTF-8")
然后 在gb2312 转回来 ,还转得回来吗??
######好像 浏览器是先在 http头里找 Content-Type 里是否有编码设置, 有的话就按 Content-Type 里编码对
HTML 进行解码 ,没有 则根据<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 这个解码.所以 有时看到有的网站响应的 编码 和 html内容里的编码不一致时,浏览器也能正确识别( 汗,,,不知道咋想的)
最后才是根据 网页内容自动识别吧...
不知道这个优先级对不对??
######请用Apache Http ClientSocket webClient = new Socket ("www.bnu.edu.cn", 80);
PrintWriter result = new PrintWriter(webClient.getOutputStream(), true);
BufferedReader receiver = new BufferedReader (new InputStreamReader(webClient.getInputStream(),"utf-8"));
result.println("GET / HTTP/1.1");
result.println("Host: bnu.edu.cn");
result.println("Connection: Close");
result.println();
boolean bRet = true;
StringBuffer sb = new StringBuffer (8096);
while (bRet) {
if (receiver.ready()) {
int idx = 0;
while (idx!=-1) {
idx = receiver.read();
sb.append((char)idx);
}
bRet = false;
}
}
//byte [] b = (sb.toString()).getBytes("UTF-8");//"GBK", "ISO-88591-1";
//String str = new String(b,"GB2312");
//String str = new String(b);
System.out.println(sb.toString());
webClient.close();
在获取字符解码的时候使用UTF-8,它本身是UTF-8的字符,所以不必要在进行转码。直接打印出来就行了
######真接打印出来的话就是乱码,不然的话,也不会想办法转码了。。。问题的原因找到了, 之前直接打印之所以是乱码, 原因在于用的Eclipse在Windows上默认Encoding=GBK, 把默认Encoding改成UTF-8之后, 就如楼上的兄弟们所说, 可以直接打印出正常的字符串了. 非常感谢大家的指引.