最近正在尝试一个小小的项目,根据给定的URL获取相应的HTML文件的内容,这里HTML的内容以文字为主,且只考虑中文和英文内容,其他语言不考虑,并忽略图片、链接之类的情况。我开始用的是InputStream类,直接读取之后输出为.txt文件或者写入到一个String中。但是测试后发现很多情况下输出的内容完全是乱码,例如采用UTF-8格式编码的中文网页,输出后的.txt文件的内容就完全是乱码。我用的环境是JDK5.0和Eclipse3.2,其中Eclipse的默认编码是GBK。
我自己也查找了一些资料,大部分都说JAVA出现乱码的问题需要通过转码来解决。但我还是有下面几个不解的地方,恳请各位高手指点。首先假设简体中文网页的编码一般是GB2312或GBK,繁体中文网页的编码一般是BIG5,英文网页的编码就多了,常见的有UTF-8,UTF-16之类,目前暂时只考虑上述几种编码方式,而给定的URL对应的HTML具体是哪种编码不可知,那么:1.如果我开始根本就不知道HTML文件的编码方式,使用InputStream获取内容的时候JVM是怎么解码的?如果这里是使用某一种固定的编码方式解码,那岂不是意味着一旦编码方式与默认的情况不符,InputStream中的内容就必然是乱码了?2.如果我开始根本就不知道HTML文件使用的语言是中文还是英文,那转码的时候应该转成什么编码呢?UTF-8?3.我看到网上提到一种方法,说是可以通过判断HTML文件的meta标签中的charset值来获取HTML的编码方式,我觉得这个办法不错,但我不明白如果HTML的内容仅仅是读入到InputStream流中,而尚未输出到文件或者赋给String,那究竟该怎么判断啊?因为我自己觉得如果不输出或是转化为String的话,正则表达式什么的不是也不能用么?而如果要输出,那就必须指定正确的、与解码方式一致的编码方式,否则就像现在一样得到的会是乱码。不明白这是怎么个道理,求大家指点。4.还有一个思路就是用byte数组,这个可行吗?不知道具体该怎么操作,还要请各位指点。5.最后,我要解决的根本问题其实是获取网页的文本内容,直接使用HTML Parser之类的解析工具能不能直接提取出来啊?也就是说能不能回避这个解码编码的问题,直接得到文本?网上都说HTML Parser功能很强大,我想应该是可以做到的吧?但我不知道具体该怎么用,还恳请有使用经验的高手大虾们赐教。以上几个问题困扰我很久了,一直不得要领,恳请大家帮帮忙,谢谢大家了!哪怕您只知道其中的一点,也请您指点一二,万分感谢!!!
我自己也查找了一些资料,大部分都说JAVA出现乱码的问题需要通过转码来解决。但我还是有下面几个不解的地方,恳请各位高手指点。首先假设简体中文网页的编码一般是GB2312或GBK,繁体中文网页的编码一般是BIG5,英文网页的编码就多了,常见的有UTF-8,UTF-16之类,目前暂时只考虑上述几种编码方式,而给定的URL对应的HTML具体是哪种编码不可知,那么:1.如果我开始根本就不知道HTML文件的编码方式,使用InputStream获取内容的时候JVM是怎么解码的?如果这里是使用某一种固定的编码方式解码,那岂不是意味着一旦编码方式与默认的情况不符,InputStream中的内容就必然是乱码了?2.如果我开始根本就不知道HTML文件使用的语言是中文还是英文,那转码的时候应该转成什么编码呢?UTF-8?3.我看到网上提到一种方法,说是可以通过判断HTML文件的meta标签中的charset值来获取HTML的编码方式,我觉得这个办法不错,但我不明白如果HTML的内容仅仅是读入到InputStream流中,而尚未输出到文件或者赋给String,那究竟该怎么判断啊?因为我自己觉得如果不输出或是转化为String的话,正则表达式什么的不是也不能用么?而如果要输出,那就必须指定正确的、与解码方式一致的编码方式,否则就像现在一样得到的会是乱码。不明白这是怎么个道理,求大家指点。4.还有一个思路就是用byte数组,这个可行吗?不知道具体该怎么操作,还要请各位指点。5.最后,我要解决的根本问题其实是获取网页的文本内容,直接使用HTML Parser之类的解析工具能不能直接提取出来啊?也就是说能不能回避这个解码编码的问题,直接得到文本?网上都说HTML Parser功能很强大,我想应该是可以做到的吧?但我不知道具体该怎么用,还恳请有使用经验的高手大虾们赐教。以上几个问题困扰我很久了,一直不得要领,恳请大家帮帮忙,谢谢大家了!哪怕您只知道其中的一点,也请您指点一二,万分感谢!!!
import java.net.URL;public class Download {
private static void download(URL input, File output) throws IOException {
InputStream in = input.openStream();
try {
OutputStream out = new FileOutputStream(output);
try {
copy(in, out);
} finally {
out.close();
}
} finally {
in.close();
}
} private static void copy(InputStream in, OutputStream out)
throws IOException {
byte[] buffer = new byte[1024];
while (true) {
int readCount = in.read(buffer);
if (readCount == -1) {
break;
}
out.write(buffer, 0, readCount);
}
} public static void main(String[] args) {
try {
URL url = new URL("http://sohu.com");
File file = new File("data.html");
download(url, file);
} catch (IOException e) {
e.printStackTrace();
}
}
}
return (null);
int start = contentType.indexOf("charset=");
if (start < 0)
return (null);
String encoding = contentType.substring(start + 8);
int end = encoding.indexOf(';');
if (end >= 0)
encoding = encoding.substring(0, end);
encoding = encoding.trim();
if ((encoding.length() > 2) && (encoding.startsWith("\""))
&& (encoding.endsWith("\"")))
encoding = encoding.substring(1, encoding.length() - 1);
return (encoding.trim());
}详见 org.apache.tomcat.util.http.ContentType 类源代码:
http://svn.apache.org/repos/asf/tomcat/tc5.5.x/tags/TOMCAT_5_5_28/connectors/util/java/org/apache/tomcat/util/http/ContentType.java这个类在 Tomcat 5.5.x 中位于 %TOMCAT55_HOME%/server/lib/tomcat-util.jar 中
这个类在 Tomcat 6.0.x 中位于 %TOMCAT6_HOME%/lib/tomcat-coyote.jar 中