前些日子QQ群里面的某个小朋友在学习文件的读写发现一个乱码的问题
文件内容如下
运行结果如下
代码如下
观察其运行结果部分的乱码部分正常不像是一般编码的错误再仔细观察其代码发现数组分配的是个字节猜测其代码可能在临界处拆分了某些汉字于是让小朋友改成运行后一切正常
以上只是一个小小的插曲只是没想到自己也会在类似问题上中招
自己一直有些小想法把一些繁琐网站操作根据日常的工作流程来程序化想了很久去年就开始策划直到前两天才真正动手
代码很简单只是普通的httpclient使用做些专属的爬虫
万万没想到的是运行结果却出现了乱码而且还是部分的乱码网上也搜索过类似的问题多人都遇到只是再也没有见到过有能够解决问题的答案
乱码的形式是这样的
直接访问网站看到的内容是<td>编号</td> 但是通过代码回来的结果是 <td>编?</td>
代码如下
<SPAN > </SPAN>HttpGet httpget = new HttpGet(url);
HttpResponse response = (httpget);
HttpEntity entity = responsegetEntity();
if (entity != null) {
BufferedReader br = new BufferedReader(new InputStreamReader(entitygetContent()));
String s = ;
StringBuffer sb = new StringBuffer();
while ((s = brreadLine()) != null) {
sbappend(s + \r\n);
}
brclose();
Systemoutprintln(new String(sbtoString()getBytes(GBK)UTF));
}
怀疑过GBK没有包含网页所有的字符编码胡思乱想过需要反复多次解码折腾了个小时百思不得其解
于是停下来再思考可能出现错误的地方sb的值由append方法加入来源是BufferedReader的readLiine方法会不会这个readLine有问题?
干脆不要readLine不要用BufferedReader 直接用InputSteam的read方法
代码如下
<SPAN > </SPAN>HttpPost httppost = new HttpPost(url);
HttpResponse response = (httppost);
HttpEntity entity = responsegetEntity();
StringBuffer sb = new StringBuffer();
if (entity != null) {
InputStream is = entitygetContent();
byte[] bytes = new byte[];
int size = ;
while ((size = isread(bytes)) > ) {
String str = new String(bytes size UTF);
sbappend(str);
}
isclose();
}
return sbtoString();
至此烦人的部分正常部分乱码问题才真正搞定