我有一些用 ISO-8859-1 编码的文本,然后我使用正则表达式从中提取一些数据。
问题是我从匹配器对象获得的字符串格式错误,扰乱了像“ÅäÖ”这样的字符。
如何阻止正则表达式库扰乱我的字符?
编辑:这是一些代码:
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
最佳答案
这可能是导致您的问题的直接原因,并且肯定是一个错误:
builder.append(new String(tmp), 0, read-1);
当您调用不采用字符集的 new String(byte[])
构造函数之一时,它会使用平台默认编码。显然,您平台上的默认编码不是 ISO-8859-1。您应该能够从响应 header 中获取字符集名称,以便可以将其提供给构造函数。
但是无论如何你都不应该使用 String 构造函数;正确的方法是使用InputStreamReader。如果编码是多字节编码之一,例如 UTF-8,则很容易损坏数据,因为一大块字节恰好在字符中间结束。
无论如何,永远、永远不要使用 new String(byte[])
构造函数或 String.getBytes()
方法不接受 Charset 参数。这些方法应该被弃用,并且当有人使用它们时应该发出猛烈的警告。
关于java - java 中的正则表达式和 ISO-8859-1 字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3431145/