Я искал это и нашел много информации о параметрах 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
Но, это не решило мою проблему. Затем я подумал, что это может быть сторона записи, поэтому построитель процесса, когда он создает фактическую «команду командной строки» перед ее выполнением, может изменить ее, по крайней мере, изначально он имеет cp1252, как видно на выходе. Итак, я попытался установить соответствующие свойства перед вызовом построителя процессов, но, как вы можете видеть, это опять же не сработало.
Теперь я немного растерялся и растерялся. идеи. По сути, моя цель состоит в том, чтобы, независимо от системных настроек и местонахождения компьютера, поддерживать передачу в мое приложение-импортер путей к файлам, которые содержат символы Юникода, такие как эти китайские.
Может кто-нибудь объяснить, что я делаю неправильно или в чем проблема, которая мешает этому работать?
Подробнее здесь: https://stackoverflow.com/questions/790 ... w-can-i-av
Мобильная версия