[英]UTF-8 & ISO-8859-1 not working for decoding European charset in Java
[英]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()
不接受字符集參數的方法。 這些方法應被棄用,並在任何人使用它們時發出凶猛的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.