2011-11-09 30 views
1
 URL url = new URL("http://soandso.com"); 
     String userpassword = username + ":" + password; 
     conn = (HttpURLConnection)url.openConnection(); 
     conn.setDoOutput(true);   
     conn.setRequestMethod("POST");   
     BASE64Encoder enc = new sun.misc.BASE64Encoder();   
     String encodedAuthorization = enc.encode(userpassword.getBytes()); 
     conn.setRequestProperty("Authorization", "Basic "+encodedAuthorization); 
     OutputStreamWriter writer =new OutputStreamWriter(conn.getOutputStream()); 
     writer.write("ABC"); 
     writer.flush(); 
     writer.close(); 
     BufferedReader rd =new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     while ((inputLine = rd.readLine()) != null) 
     System.out.println(inputLine); 

輸出我得到如下。從HttpURLConnection輸入錯誤InputStream

ÃœNÄ°TESA°TOPLANTI SALONU

但實際產量應該是 - 摹ÜNİTESİTOPLANTI SALONU

誰能告訴我如何解決這一問題?

PS:代碼不是來自任何servlet。它不是一個Java類。

回答

2

這將使用系統默認的字符編碼:

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); 

同樣所以將這樣的:

BufferedReader rd = new BufferedReader(
    new InputStreamReader(conn.getInputStream())); 

使用系統默認的編碼幾乎總是一個壞主意,特別是網絡。

你編碼想要用於POST嗎?你應該設置Content-Type頭來指定你使用的編碼,顯然也可以在構造函數調用OutputStreamWriter中指定它。同樣,您應該使用響應的內容類型來確定在InputStreamReader調用中指定哪種編碼。

一般來說,這是值得使用更高級別的HTTP庫,如Apache HttpClient。這應該能夠爲你處理編碼。

+0

謝謝,喬恩。想知道哪種內容類型可以幫助我。 –

+0

@ harish.raj:它會出現在charset部分,例如'Content-Type:text/plain;字符集= UTF-8'。見http://www.w3.org/International/O-charset –

+0

這聽起來像一個HTML代碼。抱歉。如何在InputStream中解決這個問題? –

1

您正嘗試通過字符流讀取器(InputStream Reader)讀取字節流(InputStream)。這樣做時你應該保持謹慎。您需要指定閱讀器的字符集來正確解釋傳入的字節。所以需要知道正在接收的數據的字符集和編碼,並使用相同的字符集構建InputStreamReader,以便正確解釋數據。

+0

Vikas,你能否認出我應該用哪個字符集來解決這個問題?我試過了,UTF-8和ISO-8859-1。但沒有運氣! –

+0

它可能是ISO-8859-3,但很可能編碼將在請求標題中提供,否則您將確實需要詢問您正在查詢的服務器的所有者。 –

+0

您可以從服務器獲取的HTTP響應中讀取字符編碼。然後,您可以適當地構建您的閱讀器。 – Drona