Java:Windows上的.exec()和Unicode符号:如何使其与非英文字母一起工作?

2wnc66cl  于 7个月前  发布在  Windows
关注(0)|答案(1)|浏览(56)

简介

我正在使用xml.exec()执行一些外部命令,并且我使用的参数包含非英文字符。我只是想运行类似于python test.py шалом的命令

直接在cmd中正确工作,但通过Runtime.exec.getRuntime()("python test.py шалом")处理不正确

在Windows上,我的外部程序由于传递给它的未知符号而失败。
我记得在2010年代早期(!)-JDK-4947220出现了类似的问题,但我认为它在Java Core 1.6中已经得到了修复。

环境:

**操作系统:**名称Microsoft Windows 10 Pro(Version 10.0.18362 Build 18362)
**Java:**jdk1.8.0_221

代码

要理解这个问题-最好的方法是使用下面列出的代码片段:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MainClass {
    private static void foo(String filename) {
        try {
            BufferedReader input = new BufferedReader(
                    new InputStreamReader(
                            Runtime.getRuntime().exec(filename).getInputStream()));
            String line;
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
            input.close();
        } catch (Exception e) { /* ... */ }
    }

    public static void main(String[] args) {
        foo("你好.bat 你好"); // ??
        foo("привет.bat привет"); // ??????
        foo("hi.bat hi"); // hi
    }
}

字符串
其中.bat文件只包含简单的@echo %1输出将是:

??
??????
hi


PS System.out.println("привет")-工作正常,打印正确

问题如下:

1)此问题是否与Utf-8 utf-16格式有关?
2)如何解决这个问题?我不喜欢这个answer,因为它看起来像一个非常危险和丑陋的解决办法。
3)有谁知道为什么批处理文件的文件名没有被破坏,这个文件可以找到,但参数被破坏?可能是@echo的问题?

sc4hvdpw

sc4hvdpw1#

1.是的,问题与UTF有关。理论上,为执行bat文件的cmd设置65001代码页应该可以解决这个问题(沿着将UTF-8字符集设置为Java端的默认值)
1.不幸的是,在Windows中有一个错误,这里提到Java, Unicode, UTF-8, and Windows Command Prompt
1.所以没有简单而完整的解决方案。可能的办法是为javacmd设置相同的默认语言特定编码,如cp 1251 Cyrillic。并非所有语言都能很好地反映在windows编码中,例如中文就是其中之一。
如果在windows系统上有一些非技术性的限制,将所有cmd进程的默认编码更改为特定于语言的编码,java代码将更加复杂。在开始时,必须创建新的cmd进程,并在其stdin/stdout流上附加UTF-16 LE阅读器(对于“cmd /U”进程)和写器,从不同的线程使用CP 1251。从java发送到stdin的第一个命令应该是“chcp 1251”,第二个是bat文件的名称及其参数。
完整的解决方案仍然可以使用UTF-16 LE来阅读cmd输出,但是要传入文本,则应该使用其他通用编码,例如base64,这再次导致复杂性增加

相关问题