gpt4 book ai didi

Java:Windows 上的 Runtime.exec() 和 Unicode 符号:如何使其能够处理非英文字母?

转载 作者:太空宇宙 更新时间:2023-11-04 09:08:03 26 4
gpt4 key购买 nike

简介

我正在使用Runtime.exec()来执行一些外部命令,并且我正在使用包含非英语字符的参数。我只是想运行这样的东西:python test.py шалом

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

在 Windows 上,我的外部程序由于传递给它的未知符号而失败。

我记得 2010 年代初期的类似问题 (!) - JDK-4947220 ,但我认为自 Java core 1.6 以来它已经修复了。

环境:

操作系统:名称 Microsoft Windows 10 Pro(版本 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的问题?

最佳答案

  1. 是的,问题与 UTF 有关。理论上,执行 bat 文件的 cmd 设置 65001 代码页应该可以解决问题(以及从 Java 端将 UTF-8 字符集设置为默认值)

  2. 不幸的是,这里提到的 Windows 中有一个错误 Java, Unicode, UTF-8, and Windows Command Prompt

  3. 所以没有简单而完整的解决方案。可以做的是为 javacmd 设置相同的默认语言特定编码,例如 cp1251 Cyrillic。并非所有语言都能很好地反射(reflect)在 Windows 编码中,例如中文就是其中之一。

如果 Windows 系统存在一些非技术限制,将所有 cmd 进程的默认编码更改为特定于语言的编码,则 java 代码将会更加复杂。在开始时,必须创建新的 cmd 进程,并且应将来自不同线程的 UTF-16LE 读取器(对于“cmd/U”进程)附加到其 stdin/stdout 流,并使用 CP1251 写入器。从 java 发送到标准输入的第一个命令应该是“chcp 1251”,第二个命令是 bat 文件的名称及其参数。

完整的解决方案仍然可以使用UTF-16LE来读取cmd输出,但要传递文本,应该使用其他通用编码,例如base64,这再次导致复杂性增加

关于Java:Windows 上的 Runtime.exec() 和 Unicode 符号:如何使其能够处理非英文字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59986078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com