问题是这样出现的
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)得到一个 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();
}
///////////////////////////////////////////////////////////////////////////////////////////////
gb2312的页面 用gb2312去取数据
GBK页面用GBK去取数据
但是关于编码的疑问还是没有解决,这些基础的细节慢慢学吧原来
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 就可以