1

这不是上一个问题的重复,我发现问题出在流程上。

我的程序有问题,Java 进程的 InputStream 中似乎丢失了特殊字符。

我正在使用的代码如下:

String command = "/usr/local/bin/getTitle <URL>";
Process shellCommand = Runtime.getRuntime().exec(command);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(shellCommand.getInputStream(), "UTF-8"));
String output = null;
while ((output = stdInput.readLine()) != null) {
    System.out.println(output);
}

如果我从命令行运行“命令”,我会得到以下输出:

PSY_-_GANGNAM_STYLE_(강남스타일)_M_V

但是, System.out.println(output); 的输出 如下:

PSY_-_GANGNAM_STYLE_()_M_V

这完全破坏了我的程序。

我完全被难住了,在我的搜索中我什至没有找到任何与此相关的东西。非常感谢任何帮助!提前致谢。

更新:

如果我更改命令如下:

String command="echo 'PSY_-_GANGNAM_STYLE_(강남스 타일)_M_V'";

然后在打印输出时正确显示特殊字符。这是否有助于理解问题所在?

4

3 回答 3

0

很明显,这个问题是由某处的字符编码不匹配引起的。它可能位于的两个位置是从外部进程读取的 Reader 堆栈,或System.out. (后者似乎不太可能)。

这是我要做的:

  • 从命令行运行locale命令以查看命令 shell 使用的字符编码。

  • 检查编码是否与 Java 默认字符编码相同

  • 检查它们是否与您用于从外部进程读取的编码相同。(您已将其硬连线到“UTF-8”......)

如果这不能揭示问题的根源,请尝试将command字符串替换为"locale"以查看哪些区域设置会传播到外部进程。

如果这不起作用,请尝试将外部命令的输出捕获为字节,以十六进制显示,并尝试将它们手动解码为 UTF-8 和其他可能的字符集。

于 2012-10-20T13:41:12.910 回答
0

我的猜测是该命令以操作系统的默认编码返回一个字符串,即 Mac 上的 Mac OS Roman。您将其读取为 UTF-8。如果您弄清楚编码是什么并将其传递给 InputStreamReader 的构造函数,它应该会给出更好的结果。

如果您在 Java 中创建字符串然后将其传递给它工作正常,因为字符串不是由操作系统生成的,而是由您的 Java 进程生成的。

于 2012-10-20T12:57:29.523 回答
-4

更新 :

即使程序用 打印输出UTF-8,我也不确定,您是否会看到预期的输出,也可能看不到。因为,当我使用Eclipse IDE其他编码格式进行测试时,我看不到我的输出(日文字符)。但是当我更改为UTF-8IDE 中的编码时。我看到日文字符。这就是为什么,它也取决于您的环境编码系统。

String output = null;
while ((output = stdInput.readLine()) != null) {
    String utf8OutPut = output.getBytes("UTF-8");
    System.out.println(utf8OutPut);
}
于 2012-10-20T13:18:34.237 回答