Java ProcessBuilder заменяет символы Юникода в командах на '?'. Как мне этого избежать?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java ProcessBuilder заменяет символы Юникода в командах на '?'. Как мне этого избежать?

Сообщение Anonymous »

У меня есть приложение-импортер Java, которое выполняется через планировщик (тоже мой) с использованием ProcessBuilder. Планировщик передает путь к файлу запущенному приложению в качестве аргумента в командах построителя процессов. Теперь, если этот путь к файлу содержит, например, китайские символы, он будет содержать замены ? для всех них при получении в массиве args основного метода запущенного приложения.
Я искал это и нашел много информации о параметрах file.encoding и sun.jnu.encoding и переменной среды LANG, но в итоге мне не удалось найти решение. Поэтому я подробно обсудил это с ChatGPT и в конце концов написал небольшой тестовый класс, но все безрезультатно:

Код: Выделить всё

import java.io.File;
import java.io.IOException;
import java.util.stream.Collectors;

public class CodesetTest
{
public static void main(String[] args) {
System.out.println(System.getProperty("file.encoding"));
System.out.println(System.getProperty("sun.jnu.encoding"));
System.out.println(System.getenv("LANG"));
System.out.println(System.getenv("JAVA_TOOL_OPTIONS"));

System.setProperty("file.encoding", "UTF-8");
System.setProperty("sun.jnu.encoding", "UTF-8");
System.out.println("Properties changed!");
System.out.println(System.getProperty("file.encoding"));
System.out.println(System.getProperty("sun.jnu.encoding"));

if (args.length == 0) {
String filePath = "C:/temp/示例.txt";

ProcessBuilder processBuilder = new ProcessBuilder(
"java",
"-Dfile.encoding=UTF-8",
"-Dsun.jnu.encoding=UTF-8",
"-cp", System.getProperty("java.class.path"),
CodesetTest.class.getName(),
filePath
).inheritIO();

processBuilder.environment().put("LANG", "en_US.UTF-8");
processBuilder.directory(new File("C:/temp"));

try {
Process process = processBuilder.start();
System.out.println("Started new process: " + processBuilder.command().stream().collect(Collectors.joining(", ")));
int retVal = process.waitFor();
System.out.println("Result: " + retVal);
} catch (IOException e) {
e.printStackTrace();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
} else {
System.out.println("File path received: " + args[0]);
}
}
}
Вот результат на моей машине:

Код: Выделить всё

UTF-8
Cp1252
en_US.UTF-8
null
Properties changed!
UTF-8
UTF-8
Started new process: java, -Dfile.encoding=UTF-8, -Dsun.jnu.encoding=UTF-8, -cp, C:\Users\MRE\workspaces\pdtt\TestProject\bin, CodesetTest, C:/temp/示例.txt
UTF-8
UTF-8
en_US.UTF-8
null
Properties changed!
UTF-8
UTF-8
File path received: C:/temp/??.txt
Result: 0
Я думал, что путь к файлу будет изменен Windows и/или Java, когда эта строка будет передана в качестве аргумента, потому что построитель процесса, похоже, все еще имел правильные символы при запуске процесса. Если я правильно понял прочитанные посты и обсуждения, то для этого используется системная кодировка. Поэтому я попытался явно перезаписать эту кодировку для запущенного процесса. Это действительно изменило используемый иначе cp1252 в параметре sun.jnu.encoding на UTF-8 для второй запущенной JVM, как я и надеялся.
Но, это не решило мою проблему. Затем я подумал, что это может быть сторона записи, поэтому построитель процесса, когда он создает фактическую «команду командной строки» перед ее выполнением, может изменить ее, по крайней мере, изначально он имеет cp1252, как видно на выходе. Итак, я попытался установить соответствующие свойства перед вызовом построителя процессов, но, как вы можете видеть, это опять же не сработало.
Теперь я немного растерялся и растерялся. идеи. По сути, моя цель состоит в том, чтобы, независимо от системных настроек и местонахождения компьютера, поддерживать передачу в мое приложение-импортер путей к файлам, которые содержат символы Юникода, такие как эти китайские.
Может кто-нибудь объяснить, что я делаю неправильно или в чем проблема, которая мешает этому работать?


Подробнее здесь: https://stackoverflow.com/questions/790 ... w-can-i-av
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»