Java-compiler-Plattform-file-encoding problem

Kürzlich traf ich eine Datei character encoding Problem, ich kann mich nicht erinnern, jemals konfrontiert. Es ist durchaus üblich, um bewusst sein, der Zeichen-Codierung von text-Dateien und code schreiben, Griffe Codierung korrekt, wenn Sie laufen auf verschiedenen Plattformen. Aber das problem, das ich fand, war, verursacht durch Zusammenstellung auf einer anderen Plattform, von der execution platform. Das war ganz unerwartet, weil in meiner Erfahrung, wenn javac erzeugt eine class-Datei, die wichtige Parameter sind die java-Quell-und Ziel-Parameter, und die version des JDK zu tun kompilieren. Ich meine den Fall, Klassen compiliert mit JDK 1.6.0_22 auf Mac OS X anders Verhalten als Klassen kompiliert mit 1.6.0_23-b05 auf Linux, bei der Ausführung unter Mac OS X. Der angegebenen Quelle und Ziel 1.4.

Einen String kodiert als ISO 8859_1 im Speicher auf den Datenträger geschrieben wurde mit einem PrintStream println-Methode. Je nachdem, auf welcher Plattform der Java-code KOMPILIERT wurde, wird der string war anders geschrieben. Diese führen zu einem Fehler. Der fix für den bug war, geben Sie der Datei die Kodierung explizit beim schreiben und Lesen der Datei.

Was mich überrascht hat war, dass das Verhalten Unterschied sich je nachdem, wo die Klassen kompiliert wurden, nicht auf welcher Plattform der Klasse ausgeführt wurde. Ich bin sehr vertraut mit Java-code verhält sich anders, wenn Sie auf verschiedenen Plattformen. Aber es ist ein bisschen beängstigend, wenn der gleiche code, kompiliert auf verschiedenen Plattformen, läuft anders als auf der gleichen Plattform.

Hat jemand auf dieses spezifische problem? Es scheint schlecht für Sie beliebigen Java-code, der liest und schreibt strings in Datei ohne explizite Angabe der Zeichenkodierung. Und wie oft wird das gemacht?

  • war die problematische Datei als utf-8 kodiert? Gab es problematische Zeichen in der Quelle, oder waren die Zeichen nur ungültige nach die Zusammenstellung nur auf einer Maschine?
  • War dies für Sie zusammengestellt-Klassen mit static final (Zusammenstellung statische Finale "backt" die strings in der Klasse)? oder wenn Sie sagen, auf die Festplatte geschrieben werden, die Sie serialisieren der Daten? serialisieren einer Klasse-Instanz? Serialisierung-Methode zusammengestellt werden mit der Standardeinstellung(d.h. kompilieren Plattform) Codierung?
  • B.: In der Tat, alle string-Literale und andere compile-Zeit-Konstante strings sind "eher gebacken" in der Klasse, nicht nur static final ones.
Schreibe einen Kommentar