做抓取新闻页面时,内容里 空格竟然变成问号, 主要是新华网,别的网站没有,但是新华网有的网页也不会变成问号 如<p>????帕特里奥塔表示,巴西新政府高度重视发展对华关系,认为中国是重要的战略伙伴。巴方愿同中方共同努力,进一步推进双方各领域合作,加强双方在重大国际和地区问题上的沟通,推动两国战略伙伴关系深入发展。</p>
<p>????外交部长杨洁篪、商务部长陈德铭和巴西发展工业外贸部长皮门特尔参加会见。</p>不知道原因有知道的吗?
知道的话 在加50分(http://topic.csdn.net/u/20110302/18/448a3f47-ff93-454a-981f-bd4426858c92.html这个链接 回复一下就行)代码是:import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;public class Test {

public static void main(String aargs[]){
URL url;
try {
url = new URL("http://news.xinhuanet.com/2011-03/03/c_121146024.htm");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
InputStream in = null;
    in = url.openStream();
    String content = pipe(in,"utf-8");
    System.out.println(content);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}

}
static String pipe(InputStream in,String charset) throws IOException {   
StringBuffer s = new StringBuffer();     
if(charset==null||"".equals(charset)){    
charset="utf-8";  
}      
String rLine = null;   
BufferedReader bReader = new BufferedReader(new InputStreamReader(in,charset));  
PrintWriter pw = null;        
FileOutputStream fo = new FileOutputStream("../index.html");
      OutputStreamWriter writer = new OutputStreamWriter(fo, "utf-8");
      pw = new PrintWriter(writer);     
      while ( (rLine = bReader.readLine()) != null) {   
      String tmp_rLine = rLine;       
      int str_len = tmp_rLine.length();     
      if (str_len > 0) {           
      s.append(tmp_rLine+"\n");      
      pw.println(tmp_rLine);    
      pw.flush();           
          }          
      tmp_rLine = null; 
       }   
       in.close();  
       pw.close();   
       return s.toString();
       
}

}
大家试一试 到底什么原因  

解决方案 »

  1.   

    换成 这个 汉字就乱码 新华网采用的 是 utf-8的  在说了  是汉字乱码编码才错 我汉字显示正常  只是读取HTML  空格的时候才是问号   只是内容里才是问号 其他的空格一律正常    
      

  2.   

    怎么替换的啊  我用replace("????", "")替换不了啊  
    要是能替换 我也不会这么着急了
      

  3.   

    肯定是开发时候的编码问题;
    你悲剧了,那个网页上编码有问题,比如说你有时候在网页上拷贝的代码不能在eclipse里保存,会提示编码格式不正确,这时候你删除几个空格就可以保存了,有时候会选择在windows底下强制保存,这个乱码很可能就是他们开发时候这样来的。
    现在唯一的解决办法就是replaceAll了,替换所有的四个问号,要快的好只有这样了
      

  4.   

    replaceAll("[????]","")或者replaceAll("\\?\\?\\?\\?","")都试试  我一会看下
      

  5.   

    System.out.println(content.replaceAll("//?//?//?//?",""));这个搞定
      

  6.   

    不行啊  打印出来的还是<p>????温家宝说,近年来中国同巴西的友好合作关系全面、快速发展,在双边和国际领域都取得重要成果,其意义和影响是广泛而深远的。</p>不知道怎么回事 我不理解啊  要是这样直接就去掉了 我也不会这么麻烦了你不要复制那段话  直接运行上面的代码  打印出来一句话看看是不是还在。 谢谢
      

  7.   


    可能是问号的编码问题  不知道是什么格式的 复制上去也不行 试了别的也不行 是不是我的IDE有问题i啊 不会吧
      

  8.   

     把String tmp_rLine = rLine;换成 String tmp_rLine = rLine.replaceAll(" ");这个空格是全角的空格,你试下看可以不
      

  9.   

    String regEx = "[\\x00-\\xff][\\x00-\\x7F]";
    Pattern p = Pattern.compile(regEx);
    String stra = " 高ah?蒚";
    Matcher matcher = p.matcher(stra);
    System.out.println(matcher.replaceAll(""));
    不知道这样能不能满足你的要求
      

  10.   

    很幸运楼主,前两天我也碰到了类似的问题,有个网站的网页编码是utf-8的,我抓取下也是一大堆问号,而且替换不掉,楼主尝试下用这个试试,有用给分谢谢String dsp= 抓取的网页内容;
    dsp = new String(dsp.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ')
    ;
      

  11.   

    replace(' ', ' ') 前面这个是全角空格 请注意
      

  12.   

    顶楼上,你这个可以,我刚才也用了这种办法,只不过刚才我用的getbytes 是 gb2312 呵呵
      

  13.   

    new String(dsp.getBytes("iso8859-1"),"gb2312"),怪不得我的终极办法刚才不行,原来我的byte数组转成了iso8859-1,一大堆乱码
      

  14.   


    麻烦哥们解释一下 什么意思 顺便再http://topic.csdn.net/u/20110302/18/448a3f47-ff93-454a-981f-bd4426858c92.html  这个网址回复一下  那儿也有50分  给你分  谢谢!
      

  15.   

    你照抄用就好了,哈哈,字符串先转换成byte数组,第一个replace问号替换为半角空格,第二个全角空格替换半角空格,功劳是人家的,给我点苦劳就好了
      

  16.   

    不是编码问题,我原先抓取网页时候遇到过
    是因为空格是&nbsp;转义过的,这个&nbsp;抓下来出现了乱码"????",所以要单独对&nbsp;处理,我原先写过一个方法,忘记了,可以给你查查
      

  17.   

    楼主怎么这么笨,呵呵,把一个问号换成四个问号不就完了;
    content = new String(content.getBytes(),"gb2312").replace("????", " ").replace(' ', ' ');
      

  18.   

    关&nbsp什么事,这些符号是以明文表现在源码里的,怎么会被Java“翻译” 四个问号呢
      

  19.   

    这样:
    String s = "????";
    byte[] b = s.getBytes();
    for(byte by : b){
    by = (byte) ((by >> 1) + 1);
    System.out.println((char)by);
    }意思就是????的ascii码是63,对应的二进制是111111,然后空格的ascii是32,对应的二进制是100000,先进性右移操作在+1得到byte,值为32,即空格的ascii码,然后直接转成char就得到了空格,右移运算也可以直接改为&运算,即为by = (byte) (by & 100000);
      

  20.   


    我也不清楚,可能是编码问题?但是我原先抓取都设置过和页面一样的编码拿下来,中文没问题,就只有这个&nbsp;会出现乱码,不知道什么情况。中文没问题就说明不是编码方式不同造成的乱码
      

  21.   

    byte[] b = s.getBytes();
            for(byte by : b){
                by = (byte) ((by >> 1) + 1);
                System.out.println((char)by);
            }
    用我这个方法,你只需要传一个string进来,会帮你把所有的?都换成空格,这样行吗?问题可是原本应该是?的地方也换成空格了。。
      

  22.   

    对了循环里面加个if,if(by == 63)要判断下是?才转
    String s = "????aa";
    byte[] b = s.getBytes();
    for(byte by : b){
    if(by == 63)
    by = (byte) (by & 100000);
    System.out.print((char)by);
      

  23.   

    你的那个帖子有个哥们说的不错,我早上也测了 下 你的读取openstream()转换为inputstream这里改改或许就好了,问题根源在这里
      

  24.   


    public static String changeStr(String s) {
    StringBuffer sb = new StringBuffer(1024);
    if(s == null)
    return "";
    byte[] b = s.getBytes();
    for (byte by : b) {
    if (by == 63)
    by = (byte) (by & 100000);
    sb.append((char)by);
    }
    return sb.toString();
    }
    给你写个方法,调用这个,往里面传你抓下来的内容就行了
      

  25.   

    http://topic.csdn.net/u/20110302/18/448a3f47-ff93-454a-981f-bd4426858c92.html
      

  26.   


    还是不行  <p>????新华网北  乱码谢了 
      

  27.   

    我遇到了和你一样的问题,经过测试,我的问题是因为HttpResponse输出的时候,getWriter的print方法使用了系统默认的编码方式,把格式又搞坏了。只要把response编码设置setCharacterEncoding()为目标页面的编码就可以了
      

  28.   

    我也遇到这个问题,解决方法为:
      首先吧那个字符拷贝用java的replace方法替换掉就可以了。那个字符不是全角空格很诡异,没弄清楚是什么字符。
      

  29.   

    p_pre_pre_text = new String(p_pre_pre_text.getBytes(),"GBK").replaceAll(new String(" "), "").replaceAll("\\?", "");