问题是这样出现的
1)得到一个 InputStream  对象 carrot2XmlStream 
final InputStream carrot2XmlStream = response.getPayloadAsStream();以下是相关的代码:
   public final static class Response
    {
        public byte [] payload;
                public InputStream getPayloadAsStream()
        {
            return new ByteArrayInputStream(payload);
        }
    }
这个变量 carrot2XmlStream 的值,是从网站上返回的网页数据,编码格式是GBK2)使用HtmlParser,构造一个parser,
我先试了如下代码:
String strIn = inputStream2String(carrot2XmlStream);
//inputStream2String是个把 InputStream  转成 String 的函数,代码是从csdn上搜的,见下面
Parser parser = Parser.createParser(strIn , "gb2312");用这个parser 去处理的时候,中文是乱码,接着,我搜索了一下,决定这样:
String strIn = inputStream2String(carrot2XmlStream);
String strGB = new String(strIn.getBytes("unicode"), "GB2312");//先转一下编码格式
Parser parser = Parser.createParser(strGB, "gb2312");  结果同样是乱码,我是这样理解的:
我前面构造的carrot2XmlStream,里面就是存放了一个 byte 数组,系统也不会管它是什么编码格式,
然后我拿 carrot2XmlStream 构造 strIn 的时候,系统默认 String 是 unicode编码,
我用 String strGB = new String(strIn.getBytes("unicode"), "GB2312");得到一个 GB2312编码的string,
给Parser用,应该就可以了,
但是结果是错的,
我试过另外一种方法,
Parser parser = new Parser();
parser.setURL("我要访问的url");
parser.setEncoding("gb2312");这样建立的parser,后面代码处理都一样,结果是正确的,
在这里,url 按照正常的程序结构,是拿不到的,所以要解决这个问题,
由于我初用java,也没系统的学习过,有什么理解不到的地方,请大家多多指教
///////////////////////////////////////////////////////////////////////////////////////////////
    public   String   inputStream2String   (InputStream   in)   throws   IOException   
    {
        StringBuffer   out   =   new   StringBuffer();
        byte[]   b   =   new   byte[4096];
        for   (int   n;   (n   =   in.read(b))   !=   -1;)   
        {
                out.append(new   String(b,   0,   n));
        }
        System.gc();//这句是我加的,如果不强制收集,程序有时回出些莫名其妙的情况,为什么啊???
        return   out.toString();
    } 
///////////////////////////////////////////////////////////////////////////////////////////////

解决方案 »

  1.   

    乱码和页面的编码方式有关系 
    gb2312的页面 用gb2312去取数据
    GBK页面用GBK去取数据
      

  2.   

    问题大致解决了,
    但是关于编码的疑问还是没有解决,这些基础的细节慢慢学吧原来
    HtmlParser 里面有一个 lexer 对象,lexer里面有一个 page ,page 里面有source,
    如果拿
    String strIn = inputStream2String(carrot2XmlStream);
    Parser parser = Parser.createParser(strIn , "gb2312");
    这样构造,
    那么page 里面的source 就是 stringSource(htmlParser定义的类),如果这样构造
    Parser parser = new Parser();
    parser.setURL("我要访问的url");
    parser.setEncoding("gb2312");
    那么page 里面的source 就是 inputStreamSource(htmlParser定义的类),我之前估计是 String 转stringSource时出了问题,
    而直接拿 inputStream 构造 inputStreamSource 就可以