java中的正则表达式和ISO-8859-1字符集

时间:2010-08-07 16:23:05

标签: java android regex character-encoding

我有一些用ISO-8859-1编码的文本,然后我使用正则表达式提取一些数据。

问题是我从matcher对象得到的字符串格式错误,像“ÅÄÖ”这样的字符混乱。

如何阻止正则表达式库加扰我的字符?

编辑:这是一些代码:

private HttpResponse sendGetRequest(String url) throws ClientProtocolException, IOException
{
    HttpGet get = new HttpGet(url);
    return hclient.execute(get);
}
private static String getResponseBody(HttpResponse response) throws IllegalStateException, IOException
{
    InputStream input = response.getEntity().getContent();
    StringBuilder builder = new StringBuilder();
    int read;
    byte[] tmp = new byte[1024];

    while ((read = input.read(tmp))!=-1)
    {
        builder.append(new String(tmp), 0,read-1);
    }

    return builder.toString();
}
HttpResponse response = sendGetRequest(url);
String html = getResponseBody(response);
Matcher matcher = forum_pattern.matcher(html);
while(matcher.find()) // do stuff

2 个答案:

答案 0 :(得分:3)

这可能是您问题的直接原因,而肯定是错误:

builder.append(new String(tmp), 0, read-1);

当您调用其中一个不带Charset的new String(byte[])构造函数时,它会使用平台默认编码。显然,您平台上的默认编码不是ISO-8859-1。您应该能够从响应头中获取charset名称,以便将其提供给构造函数。

但是你不应该为此使用String构造函数;正确的方法是使用InputStreamReader。如果编码是像UTF-8这样的多字节编码之一,那么你很容易破坏数据,因为一大块字节碰巧在一个字符的中间结束。

在任何情况下,从不永远使用new String(byte[])构造函数或不接受Charset参数的String.getBytes()方法。这些方法应该被弃用,并且当有人使用它们时应该发出凶猛的警告。

答案 1 :(得分:2)

  

这是来自网站的HTML。

使用HTML解析器,这个问题和所有未来的潜在问题都将消失。

我可以建议为这份工作选择Jsoup

另见: