这不是前一个问题的重复,我发现问题与过程有关。
我的程序出了问题,因为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'";
然后在打印输出时,正确显示特殊字符。这有助于理解问题所在吗?
答案 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);
}