【问题标题】:Getting improper Output from HttpURLConnection InputStream从 HttpURLConnection InputStream 获取不正确的输出
【发布时间】:2011-11-09 06:42:40
【问题描述】:
      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İ 托普兰蒂沙龙

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

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

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

【问题讨论】:

    标签: java inputstream httpurlconnection http-put


    【解决方案1】:

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

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

    同样如此:

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

    使用系统默认编码几乎总是是个坏主意,尤其是对于网络而言。

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

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

    【讨论】:

    • 谢谢,乔恩。想知道哪种 Content-Type 可以帮助我。
    • @harish.raj:它会在charset 部分,例如Content-Type: text/plain; charset=utf-8。见w3.org/International/O-charset
    • 这听起来像一个 HTML 代码。对不起。如何在 InputStream 中解决这个问题?
    【解决方案2】:

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

    【讨论】:

    • Vikas,你能认出我应该使用哪个字符集来解决这个问题吗?我试过了,UTF-8 和 ISO-8859-1。但没有运气!
    • 它可能是 ISO-8859-3,但很可能会在请求标头中提供编码,否则您确实需要询问您正在查询的服务器的所有者。
    • 您可以从服务器获取的 HTTP 响应中读取字符编码。然后,您可以适当地构建您的阅读器。
    猜你喜欢
    • 2011-07-19
    • 2023-04-06
    • 1970-01-01
    • 2013-08-06
    • 2016-02-05
    • 2012-09-10
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多