0

我有一个简单的 Web 服务,它列出了可变数量的外语。

其中一些以本地字符集列出(例如中文)。

我必须从网页中阅读此内容并将它们动态添加到JComboBox.

其实我是这样读的:

public static Vector getSiteLanguages() {
    System.out.println("Reading Home from " + Constants.HOME);
    URL url;
    URLConnection connection;
    BufferedReader br;
    String inputLine;

    String regEx = "<option.*value=.([A-Z]*).>(.*)</option>";
    Pattern pattern = Pattern.compile(regEx);       
    Matcher m;
    Vector siteLangs = new Vector(); 

    try {
        url = new URL( Constants.HOME);
        connection = url.openConnection();
        br = new BufferedReader(new InputStreamReader(connection.getInputStream()));

        while ((inputLine = br.readLine()) != null) {
            m = pattern.matcher(inputLine);
            while ( m.find()) {
                System.out.println(m.group(1) + "->" + m.group(2) );
                siteLangs.add(m.group(2));
            }
        }
        br.close();
    } catch (IOException e) {
        return siteLangs;
    } 

    return siteLangs;       
}

然后在JFrame课堂上我这样做:

Vector siteLangs = Language.getSiteLanguages();
JComboBox siteLangCombo = new JComboBox(siteLangs);

但是通过这种方式,所有非拉丁语言都丢失了......

在这种情况下如何保留非拉丁信息?

4

1 回答 1

0

默认情况下InputStreamReader使用平台默认字符编码将字节转换为字符。该网站显然使用不同的字符编码将字符转换为 HTTP 响应中的字节。您需要检查 HTTPContent-Type响应标头是哪一个。

String contentType = connection.getHeaderField("Content-Type");

假设它是 UTF-8,它是当今网站中最常用的字符编码,力争统治世界,以下是在构建InputStreamReader代码时应该如何指定它:

br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));

也可以看看:


与具体问题无关,theVector是自 1998 年以来已被List接口取代的遗留类。您确定在 Java 学习狂潮期间正在阅读最新资源吗?此外,当您只需要解析 HTML 时,正则表达式不应该是您的首选。这是Java,不是PHP。使用普通的 HTML 解析器。您可能会发现Jsoup 对此很有帮助。然后可以将您到目前为止的整个代码恢复为两三行。

于 2012-05-19T19:28:41.660 回答