Java inputStreamReader Charset

时间:2011-05-01 17:14:18

标签: java character-encoding inputstream inputstreamreader

我想ping目标IP地址并收到回复。为了实现这一点,我在Java中使用了带有runtime.exec方法和进程类的Windows命令行。我正在使用inputStreamReader获得响应。

我的默认字符集是windows-1254,它是土耳其语。当我收到回复时,回复中包含土耳其语字符,但土耳其语字符在控制台中无法正确显示。

我想从我得到的响应中获取一个数值,但我搜索的值包含一些土耳其字符,所以当我查找它时,我找不到它。

代码如下,我需要知道的是如何在这里看到土耳其字符:

runtime = Runtime.getRuntime();
process = runtime.exec(pingCommand);

BufferedReader bReader = new BufferedReader(
        new InputStreamReader(process.getInputStream(), "UTF8"));

String inputLine;
while ((inputLine = bReader.readLine()) != null) {
    pingResult += inputLine;
}

bReader.close();
process.destroy();

System.out.println(pingResult);

6 个答案:

答案 0 :(得分:6)

为了解决这个问题,检查当前操作系统在其命令行上使用的字符集并获取与此字符集兼容的数据是必要的。

我发现土耳其语XP命令行的charset是CP857,当你编辑下面的代码时,问题就解决了。

BufferedReader bReader = new BufferedReader(
        new InputStreamReader(process.getInputStream(), "CP857"));

感谢您的帮助。

注意:您可以通过“chcp”命令学习默认命令行charset。

答案 1 :(得分:2)

如果您只需要ping并获得响应时间,那么从控制台读取输出可能会过度。只要您使用的是Java5或更新版本,就会有更简单的方法:

这是一个完整的程序,您可以使用它来执行此操作。注意:在Unix / Linux / Mac OS上,您必须在“sudo”下运行此程序才能从“localhost”以外的任何其他方式获得响应。

import java.net.InetAddress;
import java.io.IOException;

class PingTest {

  public static void main(String[] args) {
    try {
      String hostnameOrIP = args[0];
      int timeout = Integer.parseInt(args[1]);
      int pingCount = Integer.parseInt(args[2]);

      System.out.println("Pinging '" + hostnameOrIP + "'");
      for (int i = 0; i < pingCount; i++) {
        System.out.println("Response time: " + getPingResponseTime(hostnameOrIP, timeout));
      }
    } catch (Exception e) {
      System.out.println("Usage: java PingTest <hostname/IP address> <timeout in milliseconds> <number of pings to send>\n");
    }
  }

  static long getPingResponseTime(String hostnameOrIP, int timeout) {
      long startTime = System.currentTimeMillis();

      boolean successfulPing = false;

      try {
        successfulPing = InetAddress.getByName(hostnameOrIP).isReachable(timeout);
      } catch (IOException ioe) {
        successfulPing = false;
      }

      long endTime = System.currentTimeMillis();

      long responseTime = endTime-startTime;

      if (successfulPing == false)
        responseTime = -1;

      return responseTime;
  }

}

以下是我在Mac OS上运行以下内容时得到的结果(结果以毫秒为单位):

$ sudo java PingTest google.com 5000 5
Pinging 'google.com'
Response time: 419
Response time: 15
Response time: 15
Response time: 16
Response time: 16

响应时间可能因运行而异,但我看到&lt;对大多数主要站点的响应时间为20毫秒,特别是如果您运行多次ping

答案 2 :(得分:2)

您是说正确检索字符但是System.out不能正确打印它们吗? System.out绝对是一个OLD类。也许试试

PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out,"charactersethere"));
out.println(“encoded system”);
out.flush();
out.close();

可能的工作

答案 3 :(得分:1)

System.out(...) - 和Java控制台 - 在编码方面非常有限。你可以期待基本的ASCII字符工作,这就是全部。如果要使用任何其他编码,则应将输出写入文本文件或GUI。如果您写入控制台,您将始终不得不应对各种非ASCII字符的不良处理。

答案 4 :(得分:0)

您需要在首选项下更改您的日食默认编码设置。它可以设置为UTF8

答案 5 :(得分:0)

尝试使用以下命令行命令:

  

CHCP

我的命令行回答了866,所以我使用了CP866