最近正在尝试一个小小的项目,根据给定的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功能很强大,我想应该是可以做到的吧?但我不知道具体该怎么用,还恳请有使用经验的高手大虾们赐教。以上几个问题困扰我很久了,一直不得要领,恳请大家帮帮忙,谢谢大家了!哪怕您只知道其中的一点,也请您指点一二,万分感谢!!!

解决方案 »

  1.   

    肯定肯定是byte[]  package CSDNTest;import java.io.*;
    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();
    }
    }
    }
      

  2.   

    你用 InputStream 取的,你写文件时需要指定使用 UTF-8 编码的,否则就是换照你系统平台的编码存文件的。HTTP 响应头中有个 Content-Type 里面有响应的编码,浏览器就是靠这个和 HTML 中的 META 识别编码的。
      

  3.   

    Tomcat 中是这样从 HTTP 请求头 Content-Type 中获得请求编码的。也就是我们在代码中使用 request.getCharacterEncoding() 方法的主要实现。藉这段代码,我们同样可以从响应头,或者是 META 中获得编码信息。 public static String getCharsetFromContentType(String contentType) {    if (contentType == null)
            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 中