Java ProcessBuilder ersetzt Unicode-Zeichen in Befehlen durch „?“. Wie kann ich das vermeiden?Java

Java-Forum
Anonymous
 Java ProcessBuilder ersetzt Unicode-Zeichen in Befehlen durch „?“. Wie kann ich das vermeiden?

Post by Anonymous »

Ich habe eine Java-Importanwendung, die über einen Scheduler (ebenfalls von mir) unter Verwendung von ProcessBuilder ausgeführt wird. Der Scheduler übergibt einen Dateipfad zur gestarteten Anwendung als Argument in den Befehlen des Process Builders. Wenn dieser Dateipfad nun beispielsweise chinesische Zeichen enthält, werden alle Zeichen durch ? ersetzt, wenn sie im args-Array der Hauptmethode der gestarteten Anwendung empfangen werden.
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]);
}
}
}
Hier ist die Ausgabe auf meinem Computer:

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
Ich dachte, der Dateipfad würde von Windows und/oder Java geändert, wenn diese Zeichenfolge als Argument übergeben wird, da der Prozess-Builder beim Starten des Prozesses anscheinend immer noch die richtigen Zeichen hatte. Wenn ich die von mir gelesenen Beiträge und Diskussionen richtig verstanden habe, wird dafür der Zeichensatz des Systems verwendet. Deshalb habe ich versucht, diesen Zeichensatz explizit für den gestarteten Prozess zu überschreiben. Dadurch wurde der ansonsten verwendete cp1252 im sun.jnu.encoding-Parameter für die zweite gestartete JVM in UTF-8 geändert, wie ich gehofft hatte.
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post