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

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

Сообщение 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 ... -can-i-avo
Ответить

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

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

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

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

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