Java使用正确的编码获取url

时间:2015-12-18 17:33:38

标签: java file url encoding utf-8

我想下载许多网页的来源,然后写入该文件并在NetBeans控制台中打印出来。我有编码问题。首先检查我的代码:

public static final void foo(URL url, Charset endoding, String file) {
    BufferedReader in;
    String readLine;
    try
    {
        in = new BufferedReader(new InputStreamReader(url.openStream(), encoding));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file) , encoding));
        while ((readLine = in.readLine()) != null) {
            System.out.println(readLine+"\n");
            out.write(readLine+"\n");
        }
        out.flush();
        out.close();
    }
}

我在2个外国网站(例如捷克语和泰语)上进行测试

我尝试了Charset.forName(“UTF-8”),它似乎在泰国网页上正常工作,但实际上捷克的网页却没有。控制台和文件包含问号,例如 。

我也尝试过正确保存文件的ISO-8859-2,但控制台显示小矩形而不是字母ž,š等。

对于多语言网站(如捷克语,日语,泰语等等)是否存在任何通用解决方案,我可以将其保存为与打印到控制台或保存到变量相同的正确文件?

1 个答案:

答案 0 :(得分:1)

问题在于没有最终编码这样的东西。现有技术的编码当时可能是UTF-8,即使每一方都能决定它自己使用哪种编码。 Here是一篇相当不错的文章,它描述了char编码作为全球解决方案的基本问题。

因此,最好的解决方案是使用InputStreamReader.getEncoding()获取html页面编码:

public static final void foo(URL url, String file){
  BufferedReader in;
  String readLine;
  try{
    InputStreamReader isr = new InputStreamReader(url.openStream());
    String encoding = isr.getEncoding(); //if you actually need it, which I don't suppose
    in = new BufferedReader(isr);
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file) , encoding));
    while ((readLine = in.readLine()) != null) {
      System.out.println(readLine+"\n");
      out.write(readLine+"\n");
    }
    out.flush();
    out.close();
  }
}

这应该按预期工作。