流入InputStream中丢失的特殊字符

时间:2012-10-20 12:47:26

标签: java character-encoding

这不是前一个问题的重复,我发现问题与过程有关。

我的程序出了问题,因为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);
}

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

PSY_-_GANGNAM_STYLE_(강남스타일)_M_V

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

PSY_-_GANGNAM_STYLE_()_M_V

这完全打破了我的计划。

我完全难过了,在搜索中我找不到任何与此相关的东西。任何帮助非常感谢!提前谢谢。

更新

如果我按如下方式更改命令:

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

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

3 个答案:

答案 0 :(得分:0)

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

如果你用Java创建字符串然后传递它就可以了,因为那时字符串不是由OS生成的,而是由你的Java进程生成的。

答案 1 :(得分:0)

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

这就是我要做的事情:

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

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

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

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

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

答案 2 :(得分:-4)

更新:

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

String output = null;
while ((output = stdInput.readLine()) != null) {
    String utf8OutPut = output.getBytes("UTF-8");
    System.out.println(utf8OutPut);
}