我有一些用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
答案 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)