簡體   English   中英

Java HttpURLConnection編碼錯誤

[英]Wrong encoding with Java HttpURLConnection

嘗試從MS Web服務讀取生成的XML

URL page = new URL(address);
StringBuffer text = new StringBuffer();
HttpURLConnection conn = (HttpURLConnection) page.openConnection();
conn.connect();
InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
BufferedReader buff = new BufferedReader(in);
box.setText("Getting data ...");
String line;
do {
  line = buff.readLine();
  text.append(line + "\n");
} while (line != null);
box.setText(text.toString());

要么

URL u = new URL(address);
URLConnection uc = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {

    inputLine = java.net.URLDecoder.decode(inputLine, "UTF-8");
  System.out.println(inputLine);
}
in.close();

任何頁面都可以正常讀取,除非Web服務輸出奇怪地讀取了大於和小於符號

它讀取<到“&lt;” 和>到“&gt;” 沒有空格,但是如果我在這里輸入它們而沒有空格stackoverflow使它們<和>

請幫忙謝謝

首先,這一行似乎有些混亂:

inputLine = java.net.URLDecoder.decode(inputLine, "UTF-8");

這實際上表示您希望服務器提供的文檔中的每一行都經過URL編碼。 URL編碼與文檔編碼不同。

http://en.wikipedia.org/wiki/Percent-encoding

http://en.wikipedia.org/wiki/Character_encoding

查看您的代碼片段,我認為URL編碼(百分比編碼)不是您想要的。

文檔字符編碼方面。 您正在此行進行轉換:

InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());

conn.getContent()返回一個InputStreamconn.getContent()字節進行操作,而閱讀器對chars進行操作-字符編碼轉換在此完成。 檢出InputStreamReader的其他構造函數,該構造函數將編碼作為第二個參數。 沒有第二個參數,您將退回到Java平台的默認值上。

InputStreamReader(InputStream in, String charsetName)

例如,讓您將代碼更改為:

InputStreamReader in = new InputStreamReader((InputStream) conn.getContent(), "utf-8");

但是真正的問題將是“服務器以哪種編碼提供內容?” 如果您也擁有服務器代碼,則可以將其硬編碼為諸如utf-8合理代碼。 但是,如果它可以變化,則需要查看http標頭的Content-Type來找出它。

String contentType = conn.getHeaderField("Content-Type");

contentType的內容看起來像

text/plain; charset=utf-8

獲得該字段的簡便方法是:

String contentEncoding = conn.getContentEncoding();

注意,很可能沒有提供字符集或沒有Content-Type頭,在這種情況下,您必須使用合理的默認值。

Mark Rotteveel是正確的,Web服務是罪魁禍首,出於某種原因,它發送帶有&lt和&gt格式的大於和小於符號

感謝Martin Algesten,但我已經說過要解決這個問題,我只是在尋找為什么這樣做。

暫無
暫無

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

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