Получение неправильного вывода из HttpURLConnection InputStream - PullRequest
1 голос
/ 09 ноября 2011
      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);

Вывод, который я получил, следующий.

ТЕНЬ ° TOPLANTI SALONU

Но фактический результат должен быть - G ÜNİTESİ TOPLANTI SALONU

Может кто-нибудь сказать мне, как это исправить?

PS: код не из какого-либо сервлета. Это не класс Java.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

При этом будет использоваться системная кодировка символов по умолчанию:

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

Аналогично будет так:

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

При использовании системной кодировки по умолчанию почти всегда aплохая идея, особенно для работы в сети.

Какую кодировку вы хотели использовать для POST?Вы должны установить заголовок Content-Type, чтобы указать, какую кодировку вы используете, и, очевидно, также указать это в вызове конструктора OutputStreamWriter.Аналогично, вы должны использовать Content-Type ответа , чтобы определить, какую кодировку указывать в вызове InputStreamReader.

В общем, именно такие вещи делают целесообразным использование более высокогоHTTP-библиотека высокого уровня, такая как Apache HttpClient .Это должно быть в состоянии обработать кодировку для вас.

1 голос
/ 09 ноября 2011

Вы пытаетесь прочитать поток байтов (InputStream) через устройство чтения символьного потока (InputStream Reader).Вы должны быть осторожны при этом.Вам нужно указать кодировку для читателя, чтобы правильно интерпретировать входящие байты.Поэтому необходимо знать кодировку и кодировку получаемых данных и создать InputStreamReader с той же кодировкой, чтобы данные правильно интерпретировались.

...