簡體   English   中英

Java中的Regex和ISO-8859-1字符集

[英]Regex and ISO-8859-1 charset in java

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

這可能是造成問題的直接原因,並且絕對是錯誤的:

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

當您調用不帶字符集的new String(byte[])構造函數之一時,它將使用平台默認編碼。 顯然,您平台上的默認編碼不是ISO-8859-1。 您應該能夠從響應頭獲取字符集名稱,以便將其提供給構造函數。

但是無論如何,您不應該為此使用String構造函數。 正確的方法是使用InputStreamReader。 如果編碼是UTF-8之類的多字節編碼之一,則由於字節字節恰好在字符中間結束,您很容易破壞數據。

在任何情況下,永遠, 永遠使用一個new String(byte[])構造函數或String.getBytes()不接受字符集參數的方法。 這些方法應被棄用,並在任何人使用它們時發出凶猛的警告。

它是網站上的html。

使用HTML解析器,此問題以及所有將來的潛在問題都將消失。

我可以建議選擇Jsoup來完成這項工作。

也可以看看:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM