前些日子,QQ群里面的某个小朋友在学习文件的读写,发现一个乱码的问题。
文件内容如下:
运行结果如下:
代码如下:
观察其运行结果,部分的乱码,部分正常,不像是一般编码的错误。再仔细观察其代码,发现数组分配的是10个字节,猜测其代码可能在临界处拆分了某些汉字,于是让小朋友改成12,运行后一切正常。
以上只是一个小小的插曲,只是没想到自己也会在类似问题上中招。
自己一直有些小想法,把一些繁琐网站操作根据日常的工作流程来程序化。想了很久,去年就开始策划,直到前两天才真正动手。
代码很简单,只是普通的httpclient使用,做些专属的爬虫。
万万没想到的是,运行结果却出现了乱码,而且还是部分的乱码。网上也搜索过,类似的问题,多人都遇到,只是再也没有见到过有能够解决问题的答案。
乱码的形式是这样的:
直接访问网站,看到的内容是“<td>编号:</td>” 但是通过代码回来的结果是 “<td>编?</td>” 。
代码如下:
<SPAN ></SPAN>HttpGet httpget = new HttpGet(url);HttpResponse response = (httpget);HttpEntity entity = response.getEntity();if (entity != null) {BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));String s = “”;StringBuffer sb = new StringBuffer(“”);while ((s = br.readLine()) != null) {sb.append(s + “\r\n”);}br.close();System.out.println(new String(sb.toString().getBytes(“GBK”),”UTF-8″));}
怀疑过GBK没有包含网页所有的字符编码,胡思乱想过需要反复多次解码。折腾了1,2个小时,百思不得其解。
于是停下来,再思考可能出现错误的地方,sb的值由append方法加入,来源是BufferedReader的readLiine方法,会不会这个readLine有问题?
干脆不要readLine,不要用BufferedReader 直接用InputSteam的read方法。
代码如下:
<SPAN ></SPAN>HttpPost httppost = new HttpPost(url);HttpResponse response = (httppost);HttpEntity entity = response.getEntity();StringBuffer sb = new StringBuffer();if (entity != null) {InputStream is = entity.getContent();byte[] bytes = new byte[4096];int size = 0;while ((size = is.read(bytes)) > 0) {String str = new String(bytes, 0, size, “UTF-8”);sb.append(str);}is.close();}return sb.toString();
至此,烦人的部分正常部分乱码问题才真正搞定。
【警示】 以上代码片段仅为测试功能目的的示例,缺乏必要的异常处理。 如若在实际工程中引用,切记自行处理。
会得到最大的满足,因为它填补了你的空虚。