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

我得到的输出如下。

ÃœNÄ°TESÄ° TOPLANTI SALONU

但实际输出应该是 -- GÜNİTESİ TOPLANTI SALONU

谁能告诉我如何解决这个问题?

PS:代码不是来自任何servlet。它不是一个java类。

4

2 回答 2

2

这将使用系统默认字符编码:

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

同样如此:

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

使用系统默认编码几乎总是一个坏主意,特别是对于网络。

您想为 POST 使用哪种编码?您应该设置 Content-Type 标头以指定您使用的编码,并且显然还要在构造函数调用中指定它OutputStreamWriter。同样,您应该使用响应的 Content-Type来确定在InputStreamReader调用中指定哪种编码。

一般来说,正是这样的事情才值得使用更高级别的 HTTP 库,例如Apache HttpClient。那应该能够为您处理编码。

于 2011-11-09T06:45:25.517 回答
1

您正在尝试通过字符流阅读器 (InputStream Reader) 读取字节流 (InputStream)。执行此操作时应小心谨慎。您需要为阅读器指定字符集以正确解释传入的字节。因此需要知道所接收数据的字符集和编码,并使用相同的字符集构建 InputStreamReader,以便正确解释数据。

于 2011-11-09T06:59:23.833 回答