Сначала кажется, что в этом ряду путаница:
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
, и в этом случае вы должны использовать разумные значения по умолчанию.