Wie stelle ich die von der JVM (1.5.x) programmgesteuert verwendete Standardzeichenkodierung richtig ein?
Ich habe gelesen, dass dies -Dfile.encoding=whatever
früher der Weg für ältere JVMs war. Ich habe diesen Luxus aus Gründen, auf die ich nicht eingehen werde.
Ich habe versucht:
System.setProperty("file.encoding", "UTF-8");
Die Eigenschaft wird festgelegt, aber es scheint nicht zu bewirken, dass der letzte getBytes
Aufruf unten UTF8 verwendet:
System.setProperty("file.encoding", "UTF-8");
byte inbytes[] = new byte[1024];
FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
FileOutputStream fos = new FileOutputStream("response-2.txt");
String in = new String(inbytes, "UTF8");
fos.write(in.getBytes());
java
utf-8
character-encoding
Willi Mentzel
quelle
quelle
file.encoding
Eigenschaft wird nicht unterstützt .class Reader
&class Writer
)? Daclass FileInputStream
es sich um einen bytebasierten E / A-Stream handelt, warum sollte man sich also für den Zeichensatz im bytebasierten E / A-Stream interessieren?Antworten:
Leider muss die
file.encoding
Eigenschaft beim Start der JVM angegeben werden. Zum Zeitpunkt der Eingabe Ihrer Hauptmethode wurden die vonString.getBytes()
und die Standardkonstruktoren vonInputStreamReader
und verwendete ZeichencodierungOutputStreamWriter
dauerhaft zwischengespeichert.Wie Edward Grech hervorhebt, kann in einem speziellen Fall wie diesem die Umgebungsvariable
JAVA_TOOL_OPTIONS
verwendet werden, um diese Eigenschaft anzugeben, aber normalerweise geschieht dies folgendermaßen:Charset.defaultCharset()
spiegelt Änderungen an derfile.encoding
Eigenschaft wider , aber der größte Teil des Codes in den Java-Kernbibliotheken, der die Standardzeichencodierung bestimmen muss, verwendet diesen Mechanismus nicht.Wenn Sie codieren oder decodieren, können Sie die
file.encoding
Eigenschaft abfragen oderCharset.defaultCharset()
die aktuelle Standardcodierung ermitteln und die entsprechende Methode oder Konstruktorüberladung verwenden, um sie anzugeben.quelle
file.encoding
Sysprops nach dem Start der JVM.Aus der Dokumentation zur JVM ™ Tool-Schnittstelle …
Wenn Sie die Umgebungsvariable (Windows)
JAVA_TOOL_OPTIONS
auf setzen-Dfile.encoding=UTF8
, wird dieSystem
Eigenschaft (Java) bei jedem Start einer JVM automatisch festgelegt. Sie werden wissen, dass der Parameter erfasst wurde, da die folgende Nachricht an gesendet wirdSystem.err
:quelle
UTF8
oderUTF-8
?Ich habe einen hackigen Weg, der definitiv funktioniert !!
Auf diese Weise werden Sie JVM austricksen, die denken würde, dass der Zeichensatz nicht gesetzt ist, und ihn zur Laufzeit erneut auf UTF-8 setzen!
quelle
WARNING: An illegal reflective access operation has occurred • WARNING: Illegal reflective access by [..] • WARNING: Please consider reporting this to the maintainers of [..] • WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations • WARNING: All illegal access operations will be denied in a future release
Ich denke, ein besserer Ansatz als das Festlegen des Standardzeichensatzes der Plattform, insbesondere da Sie anscheinend Einschränkungen hinsichtlich der Auswirkungen auf die Anwendungsbereitstellung haben, geschweige denn auf die Plattform, besteht darin, den viel sichereren zu nennen
String.getBytes("charsetName")
. Auf diese Weise ist Ihre Anwendung nicht von Dingen abhängig, die außerhalb ihrer Kontrolle liegen.Ich persönlich bin der Meinung, dass
String.getBytes()
dies veraltet sein sollte, da es in einer Reihe von Fällen, in denen der Entwickler den möglicherweise geänderten Standardzeichensatz nicht berücksichtigt hat, zu ernsthaften Problemen geführt hat.quelle
Ich kann Ihre ursprüngliche Frage nicht beantworten, möchte Ihnen jedoch einige Ratschläge geben - hängen Sie nicht von der Standardcodierung der JVM ab. Es ist immer am besten, die gewünschte Codierung (dh "UTF-8") explizit in Ihrem Code anzugeben. Auf diese Weise wissen Sie, dass es auch auf verschiedenen Systemen und JVM-Konfigurationen funktioniert.
quelle
Versuche dies :
quelle
Wir hatten die gleichen Probleme. Wir haben einige Vorschläge aus diesem Artikel (und anderen) ohne Erfolg methodisch ausprobiert. Wir haben auch versucht, das hinzuzufügen
-Dfile.encoding=UTF8
und nichts schien zu funktionieren.Für Menschen , die dieses Problem haben, schließlich die folgenden Artikel hat uns geholfen , beschreibt die Spur , wie die Ländereinstellung brechen kann
unicode/UTF-8
inJava/Tomcat
http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat
Das korrekte Einstellen des Gebietsschemas in der
~/.bashrc
Datei hat bei uns funktioniert.quelle
Ich habe viele Dinge ausprobiert, aber der Beispielcode hier funktioniert perfekt. Verknüpfung
Der Kern des Codes ist:
quelle
Wenn Sie Spring Boot verwenden und das Argument
file.encoding
in JVM übergeben möchten, müssen Sie es folgendermaßen ausführen:Dies wurde für uns benötigt, da wir
JTwig
Vorlagen verwendeten und das Betriebssystem das hatteANSI_X3.4-1968
, was wir durch herausgefunden hattenSystem.out.println(System.getProperty("file.encoding"));
Hoffe das hilft jemandem!
quelle
Ich verwende Amazon (AWS) Elastic Beanstalk und habe es erfolgreich in UTF-8 geändert.
Gehen Sie in Elastic Beanstalk zu Konfiguration> Software, "Umgebungseigenschaften". Fügen Sie (Name) JAVA_TOOL_OPTIONS mit (Wert) -Dfile.encoding = UTF8 hinzu
Nach dem Speichern wird die Umgebung mit der UTF-8-Codierung neu gestartet.
quelle
Sie wissen nicht genau, was Sie tun, und haben zu diesem Zeitpunkt noch keine Kontrolle darüber. Wenn Sie der Zieldatei eine andere OutputStream-Klasse hinzufügen können, können Sie einen Subtyp von OutputStream verwenden, der Strings unter einem von Ihnen definierten Zeichensatz in Bytes konvertiert, beispielsweise standardmäßig UTF-8. Wenn modifiziertes UTF-8 für Ihre Anforderungen ausreicht, können Sie Folgendes verwenden
DataOutputStream.writeUTF(String)
:Wenn dieser Ansatz nicht durchführbar ist, kann es hilfreich sein, wenn Sie hier genau klären, was Sie in Bezug auf Datenfluss und Ausführungsumgebung steuern können und was nicht (obwohl ich weiß, dass dies manchmal leichter gesagt als bestimmt ist). Viel Glück.
quelle
Der Befehl arbeitete mit dem Exec-Maven-Plugin zusammen, um den folgenden Fehler beim Konfigurieren einer Jenkins-Task zu beheben.
quelle
Wir setzen dort zwei Systemeigenschaften zusammen und das System nimmt alles in utf8 auf
quelle
Nach dem Kommentar von @Caspar zur akzeptierten Antwort ist laut Sun der bevorzugte Weg, dies zu beheben:
"Ändern Sie das Gebietsschema der zugrunde liegenden Plattform, bevor Sie Ihr Java-Programm starten."
http://bugs.java.com/view_bug.do?bug_id=4163515
Für Docker siehe:
http://jaredmarkell.com/docker-and-locales/
quelle
Kürzlich bin ich auf das Notes 6.5-System eines lokalen Unternehmens gestoßen und habe herausgefunden, dass Webmail bei einer nicht von Zhongwen lokalisierten Windows-Installation nicht identifizierbare Zeichen enthält. Habe mehrere Wochen online gegraben, habe es erst vor wenigen Minuten herausgefunden:
Fügen Sie in den Java-Eigenschaften die folgende Zeichenfolge zu den Laufzeitparametern hinzu
Die UTF-8-Einstellung würde in diesem Fall nicht funktionieren.
quelle
Mein Team ist auf Computern mit Windows auf dasselbe Problem gestoßen. Anschließend konnte es auf zwei Arten behoben werden:
a) Legen Sie die Umgebungsvariable fest (auch in den Windows-Systemeinstellungen).
JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF8
b) Führen Sie das folgende Snippet in Ihre pom.xml ein:
INNERHALB
quelle