Ich habe danach gesucht und viel über die Parameter file.encoding und sun.jnu.encoding und die Umgebungsvariable LANG gefunden, aber am Ende konnte ich nichts finden eine Lösung. Also habe ich es ausführlich mit ChatGPT besprochen und am Ende eine kleine Testklasse geschrieben, aber alles ohne Erfolg:
Code: Select all
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]);
}
}
}
Code: Select all
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
Aber, Es hat mein Problem nicht behoben. Dann dachte ich, es könnte an der Schreibseite liegen, sodass der Prozess-Builder, wenn er den eigentlichen „Befehlszeilenbefehl“ erstellt, bevor er ausgeführt wird, ihn ändern könnte, zumindest hat er ursprünglich den cp1252, wie in der Ausgabe zu sehen ist. Also habe ich versucht, die entsprechenden Eigenschaften festzulegen, bevor ich den Process Builder aufrufe, aber auch das hat nicht funktioniert, wie Sie sehen können.
Jetzt bin ich etwas verloren und ratlos Ideen. Grundsätzlich besteht mein Ziel darin, unabhängig von den Systemeinstellungen und dem Standort des Computers die Übergabe von Dateipfaden an meine Importanwendung zu unterstützen, die Unicode-Zeichen wie diese chinesischen Zeichen enthalten.
Kann jemand erklären, was ich falsch mache oder was das Problem ist, das verhindert, dass dies funktioniert?