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

标签 java android regex character-encoding

我有一些用 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/

相关文章:

java - 在 Matlab 中使用 java BufferedRead 和 TCP/IP 以太网连接 - 访问最新数据

java - JNI 中的二维数组

android - 添加 compile 'com.google.firebase:firebase-database:9.6.0' 的新方法是什么?

java - 使用 PGS4A 构建失败。无效的构建文件错误

regex - 在 bash 中交换文件中的 2 个单词的最佳方法是什么

python - 正则表达式(Python)计算域名中的元素

java - 按 JTextField 值过滤 JTable 行

java - 在 AsyncTask 中运行 CountDownTimer 会抛出 java.lang.RuntimeException - Looper.prepare()

android - LUHN 信用卡验证因有效卡号而失败

java - 正则表达式检查括号是否平衡