Кодекс Regex и ISO-8859-1 в Java - PullRequest
       4

Кодекс Regex и ISO-8859-1 в Java

2 голосов
/ 07 августа 2010

У меня есть некоторый текст, закодированный в ISO-8859-1, который я затем извлекаю из данных с помощью Regex.

Проблема в том, что строки, которые я получаю от объекта соответствия, имеют неправильный формат, шифруя символы типа "ÅÄÖ".

Как мне остановить библиотеку регулярных выражений от шифрования моих символов?

Редактировать: Вот код:

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 ]

3 голосов
/ 08 августа 2010

Это, вероятно, непосредственная причина вашей проблемы, и определенно ошибка:

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

Когда вы вызываете один из конструкторов new String(byte[]), который не использует Charset, он использует кодировку платформы по умолчанию. Очевидно, кодировка по умолчанию на вашей платформе не ISO-8859-1. Вы должны быть в состоянии получить имя кодировки из заголовков ответа, чтобы вы могли предоставить его конструктору.

Но вам все равно не следует использовать конструктор String; правильный способ - использовать InputStreamReader. Если бы кодирование было одним из многобайтовых, таких как UTF-8, вы могли бы легко повредить данные, потому что кусок байтов заканчивался в середине символа.

В любом случае, никогда, ever не используйте конструктор new String(byte[]) или String.getBytes(), который не принимает параметр Charset. Эти методы не рекомендуется использовать и должны выдавать яростные предупреждения, когда кто-либо их использует.

2 голосов
/ 08 августа 2010

Это HTML-код с веб-сайта.

Используйте анализатор HTML, и эта проблема и все будущие потенциальные проблемы исчезнут.

Я могу рекомендовать выбрать Jsoup для работы.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...