2016-06-04 7 views
1

Ich las diesesWelcher Zeichensatz zum Lesen in einer Java-Quelldatei?

Should source code be saved in UTF-8 format

und ich die Eclipse-Compiler lib bin mit aber müssen einige Java-Quelldateien in lesen, um es zu dieser Bibliothek zu füttern. Es scheint, dass es in verschiedenen Formaten von diesem Beitrag gespeichert werden kann.

Gibt es einen Zeichensatz, den ich verwenden kann, um es zu lesen, so dass es jedes Mal funktioniert. Charset.forName ("UTF-8") vielleicht?

Dank, Dean

+2

Nein. Sie müssen die Datei mit dem gleichen Zeichensatz lesen, mit dem die Datei gespeichert wurde, was auch immer das sein mag. Normalerweise ist dies die native Codepage des PC, z. 'CP1252', wenn Sie Windows in den USA betreiben. Sie können Ihre eigenen Java-Quellen standardisieren, um immer UTF-8 zu verwenden, wenn Sie möchten, aber alle Dateien, die Sie von woanders erhalten, müssen möglicherweise konvertiert werden. – Andreas

+0

Also gibt es eine Möglichkeit, die Dateicodierung dann zu erkennen? –

+0

Leider nicht. UTF-16-Dateien können normalerweise leicht durch eine Stückliste identifiziert werden. UTF-8-Dateien sollten keine Stückliste haben, daher gibt es keine Möglichkeit, den Unterschied zwischen einer UTF-8, CP1252, ISO 8859-1, CP1251 oder einer anderen Codepage wirklich zu erkennen. – Andreas

Antwort

3

Zeichenkodierungen variieren

Jedes Werkzeug kann Java-Quellcode in irgendeiner Codierung schreiben. Selbst die Idee der .java-Datei ist nicht durch die Java Language Spec definiert. Beliebige IDE können Java-Quellcode beliebig beibehalten mit beliebiger Codierung.

Die Tools sind dafür verantwortlich, dass letztendlich ein Unicode-konformer Zeichenstrom in die Compiler-Toolchain eingefügt wird. Wie sie den Quellcode sammeln und beibehalten, hängt von den jeweiligen Tools ab.

Die Java Language Specification Zustände in Chapter 3 Lexical Structure:

Programme werden geschrieben, um den Unicode-Zeichensatz verwendet. Informationen über diesen Zeichensatz und die zugehörigen Zeichenkodierungen finden Sie unter http://www.unicode.org/.

So vermutlich eine Java-Quellcode-Datei einen Zeichenkodierungen mit Unicode gemeinsam wie UTF-8, UTF-16 oder UCS-2 verwenden würde.

Section 3.2 Lexical Translations erwähnt, dass ein Java-Programm eine Codierung wie ASCII durch Einbetten Unicode entkommt verwenden:

Unicode Entweichen der Form \ uxxxx, wobei xxxx ein hexadecimal Wert ist, stellt die Einheit UTF-16-Code deren Codierung ist xxxx.

Während UTF-8 ist in meiner Erfahrung üblich, das ist nicht die einzige mögliche Codierung. Sie müssen die Codierung einer bestimmten Quelldatei kennen oder erraten, und Sie müssen berücksichtigen, dass Unicode-Escapes erweitert werden.

Weitere Themen

By the way, beachten Sie, dass zumindest in der Oracle JDK, die byte order mark (BOM)optional to UTF-8 Dateien nicht in Java erlaubt ist aufgrund eines Fehlers (JDK-4508058), die nie (wegen der rückwärts fixiert werden -Kompatibilitätsprobleme).

Beachten Sie auch, dass line terminators variieren kann: die ASCII-Zeichen CR (CARRIAGE RETURN) oder LF (LINE FEED) oder CR LF.

White space variiert: RAUM (SP), CHARACTER TABULATION (HT) (horizontale Registerkarte), FORM FEED (FF), und Abschlusswiderstände.

Lesen Sie die Spezifikation für weitere Details.Zum Beispiel in Bezug auf das Ersatzzeichen:

Als besonderes Zugeständnis für die Kompatibilität mit bestimmten Betriebssystemen, die ASCII-SUB-Zeichen (\ u001a oder Steuer-Z) werden ignoriert, wenn es das letzte Zeichen in dem entkam Eingang Strom.

Über Zeichencodierung

Seien Sie sicher, dass Sie die Grundlagen von Unicode und der Zeichencodierung verstehen. Der beste Startpunkt: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) von Joel Spolsky.


Auch soll Regeln wie „eine öffentliche Klasse pro .java-Datei“ kann eher durch bestimmte Werkzeuge definiert werden als von Java selbst. Die CodeWarrior Tools für Java Weg-zurück-wenn mehrere Klassen pro Datei unterstützt.

+1

Nice write-up, aber Sie nicht vollständig den Punkt der Frage, d. H. Die Codierung der '.java' Quelldateien. ['javac'] (https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html) wird standardmäßig auf die Betriebssystem-Codepage gesetzt: * Wenn die Option' -encoding' nicht aktiviert ist angegeben, dann wird der Standard ** ** - Konverter verwendet. * Eclipse (im Kommentar erwähnt) kann damit umgehen, dass jede '.java'-Quelldatei eine andere Codepage benutzt, aber wenn Sie jemals außerhalb von Eclipse kompilieren wollen, dann Verwenden Sie besser nur eine Codepage für alle Ihre Quelldateien. Wenn nicht die Standardeinstellung, muss dies explizit angegeben werden. – Andreas

+0

@Andreas Scheint, du konzentrierst dich auf die * Ausgabe *, unter der Annahme, dass Eclipse eine Mischung von Quelldateien in verschiedenen Zeichenkodierungen toleriert. Wenn dies für Eclipse im Allgemeinen und für die "eclipse compiler lib" im Speziellen gilt (ich kenne solche Fakten nicht), scheint dies wichtig genug zu sein, um eine andere Antwort zu rechtfertigen. Aber meine Antwort adressiert den Titel ("wenn ich in einer Java-Quelldatei lese") und den letzten Satz ("einen Zeichensatz, den ich lesen kann"), über * Eingabe *, welche Zeichenkodierung mit Java-Quelldateien zu erwarten ist. Wie mein Eröffnungstitel sagt, "Zeichenkodierungen variieren". –

+0

Weiß nicht, wo Sie * Ausgang * von erhalten haben. Ich spreche von der Kodierung von '.java' Quelldateien, d. H. Der * Eingabe * für den Java Compiler. Mein Punkt war, dass Eclipse zwar gemischte Zeichenkodierungen unterstützt, aber 'javac', Ant, Maven, Gradle usw. alle eine Massenkompilierung mit einem einzelnen Zeichensatz machen, also ist es eine gute Idee, einen einzigen Zeichensatz für alle Quelldateien zu verwenden. Sicher, wenn Sie nur mit Eclipse bauen, können Sie die gemischte Zeichensatz-Funktion verwenden, aber außer dem IDE-Tool ist ein Build-Tool, zumindest außerhalb der Schulen, selten. – Andreas