Неправильное кодирование с помощью Java HttpURLConnection - PullRequest
0 голосов
/ 23 октября 2011

Попытка чтения сгенерированного XML из MS Webservice

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();

Любая страница хорошо читается, кроме вывода веб-службы. странно читает большие и меньшие знаки

это читается <до "& lt;" и> чтобы "& gt;" без пробелов, но если я введу их здесь без пробелов, stackoverflow сделает их <и>

Пожалуйста, помогите спасибо

Ответы [ 2 ]

0 голосов
/ 30 октября 2011

Марк Роттвил является правильным, веб-сервис является виновником здесь, он по какой-то причине отправляет знак больше и меньше, чем в формате & lt и & gt

Спасибо Мартину Альгестену, но я уже заявил, что работал над этим, я просто искал, почему это так.

0 голосов
/ 23 октября 2011

Сначала кажется, что в этом ряду путаница:

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() возвращает InputStream, который работает с байтами, тогда как читатель работает с символами - здесь выполняется преобразование кодировки символов. Проверьте другие конструкторы 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, и в этом случае вы должны использовать разумные значения по умолчанию.

...