2017-10-17 70 views
0

我有一個實用程序用於集成數據,並且在使用特殊字符(如「Ã」)時遇到問題。下面是問題出現的問題的方法。響應來自API並且採用xml格式。HTTPGet unicode字符出現在響應中字符串

protected String getStringHttpContent(URI url, Map<String,String> headerParameters) throws IOException 
    { 
     HttpGet request = new HttpGet(url); 
    for(String parameter : headerParameters.keySet()) 
      request.setHeader(parameter, headerParameters.get(parameter)); 

     CloseableHttpResponse response = getClient().execute(request); 
     dumpHeaders(response); 
     BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
     StringBuffer sb = new StringBuffer(); 
     String output; 
     while ((output = br.readLine()) != null) { 
      sb.append(output); 
     } 
    response.close(); 
     return sb.toString(); 

    } 

在響應字符串中的njÃientill的結果是njämientill。我試過改變編碼,但結果保持不變。任何意見,將不勝感激。

+0

你是否檢查過什麼字符編碼 - 如果有的話 - 遠程方通過響應頭指示? – CBroe

+0

是的,編碼以gzip形式出現。我試圖通過爲gzip添加適當的頭來解決這個問題,但結果保持不變。 – Filiper

回答

0

確保您使用UTF-8編碼端到端(通過整個鏈)。這包括你的網頁和用戶輸入,如果它來自html表單(例如),在頁面上設置UTF-8,web服務(web.xml,sun-web.xml等)。入站HttpRequest也應包含標題屬性「字符集」,例如。 「Content-Type:text/html; charset = utf-8」。配置服務器端和客戶端的方式取決於您使用的技術(我不知道)。

編輯:關於你的評論,即使你是客戶,你應該設置內容類型來定義你從服務器期待(這一個可能是能夠在同一服務的不同內容類型的內容URL)。

請嘗試用配置HTTPGET:

request.setHeader(HttpHeaders.CONTENT_TYPE, "application/xml; charset=utf-8"); 

或者(如果服務器是很老):

request.setHeader(HttpHeaders.CONTENT_TYPE, "text/xml; charset=utf-8"); 

更好,也許連同接受的charset指定接受頭:

request.setHeader("Accept-Charset", "utf-8"); 
request.setHeader("Accept", "application/xml"); 

如果這些作品都不起作用,我建議你在這裏展示你的郵遞員查詢或做一個Wireshark捕獲看到的實際請求和響應,另外還列出了頭部參數圖的內容。否則,我們無法爲您提供更多幫助(因爲您的其他代碼看起來不錯,依我看來)。

+0

謝謝,我試了很多次,但結果保持不變。我無法訪問提供響應的服務器,因爲它在客戶端,但使用簡單的API獲取工具(如郵遞員),我沒有這個問題。 – Filiper

+0

已編輯。希望它有幫助.. – bsaverino

+0

再次感謝,不幸的是,響應不會改變。關於地圖,對於這個請求,它只是簡單的「接受內容:application/xml」。以下是郵遞員輸出的郵件頭減去cookies。 內容編碼gzip的→內容 型→應用程序/ XML 日期→太陽,2017年10月22日16:30:00 GMT 服務器→的ServiceNow 嚴格,運輸和安全→最大年齡= 63072000; includeSubDomains 傳輸編碼→分塊 X-Is-Logged-In→true – Filiper