it-swarm.com.de

Wie kompiliere ich eine Java-Quelldatei, die als "UTF-8" codiert ist?

Ich habe meine Java-Quelldatei unter Angabe des Kodierungstyps als UTF-8 gespeichert (mithilfe von Notepad ist der Kodierungstyp von Notepad standardmäßig ANSI). 

javac -encoding "UTF-8" One.Java

aber es gab eine Fehlermeldung "

One.Java:1: illegal character: \65279

?public class One {

^
1 error

Gibt es einen anderen Weg, ich kann das kompilieren?

Hier ist die Quelle:

public class One {
    public static void main( String[] args ){
        System.out.println("HI");
    }
} 
28
asela38

Ihre Datei is wird als UTF-8 gelesen, andernfalls könnte ein Zeichen mit dem Wert "65279" niemals erscheinen. javac erwartet, dass Ihr Quellcode in der Standardcodierung der Plattform enthalten ist, gemäß der javac-Dokumentation :

Wenn -encoding nicht angegeben ist, wird der Plattform-Standardkonverter verwendet.

Die dezimale Zahl 65279 ist hexadezimal FEFF, dh die Unicode-Byte-Bestellmarke (BOM) . In UTF-8 ist dies nicht erforderlich, da UTF-8 immer als Octet-Stream codiert ist und keine Endian-Probleme hat.

Notepad hält sich gerne an Stücklisten, auch wenn sie nicht notwendig sind, aber manche Programme mögen es nicht, sie zu finden. Wie andere darauf hingewiesen haben, ist Notepad kein sehr guter Texteditor. Wenn Sie zu einem anderen Texteditor wechseln, wird das Problem fast sicher gelöst.

45
Daniel Pryden

Öffnen Sie die Datei in Notepad ++ und wählen Sie Encoding -> Convert to UTF-8 without BOM aus.

20
Adrian Toman

Dies ist kein Problem mit Ihrem Texteditor, es ist ein Problem mit javac! Die Unicode-Spezifikation besagt, dass BOM in UTF-8 optional ist. Es heißt nicht, dass es verboten ist! Wenn eine BOM vorhanden sein kann, dann muss Javac damit umgehen, aber nicht. Die Verwendung der Stückliste in UTF-8-Dateien IS ist tatsächlich hilfreich, um eine ANSI-codierte Datei von einer Unicode-codierten Datei zu unterscheiden.

Die vorgeschlagene Lösung zum Entfernen der Stückliste ist nur eine Problemumgehung und nicht die richtige Lösung.

Dieser Fehlerbericht weist darauf hin, dass dieses "Problem" niemals behoben wird: http://bugs.Java.com/view_bug.do?bug_id=4508058

Da dieser Thread in den Top-2-Google-Ergebnissen für die Suche nach "javac BOM" enthalten ist, lasse ich dies hier für zukünftige Leser.

10

javac -encoding UTF8 One.Java ausprobieren 

Ohne die Anführungszeichen und UTF8 kein Strich.

In diesem Forumsthread finden Sie weitere Links

9
StevenWilkins

Siehe unten Zum Beispiel können wir mit einem Programm (Telugu-Wörter) diskutieren.

Programm (UnicodeEx.Java)

class UnicodeEx {  
    public static void main(String[] args) {   
        double ఎత్తు = 10;  
        double వెడల్పు = 25;   
        double దీర్ఘ_చతురస్ర_వైశాల్యం;  
        System.out.println("The Value of Height = "+ఎత్తు+" and Width = "+వెడల్పు+"\n");  
        దీర్ఘ_చతురస్ర_వైశాల్యం = ఎత్తు * వెడల్పు;  
        System.out.println("Area of Rectangle = "+దీర్ఘ_చతురస్ర_వైశాల్యం);  
    }  
}

Dies ist das Programm, das als "UnicodeEx.Java" gespeichert wird und die Codierung in "Unicode" ändert.

** Wie kompiliere ich **

javac -encoding "Unicode" UnicodeEx.Java

Wie man ausführt

Java UnicodeEx

Der Wert von Height = 10,0 und Width = 25,0

Fläche des Rechtecks ​​= 250,0

4
Prashanth

Ich weiß, dass dies ein sehr alter Thread ist, aber ich hatte ein ähnliches Problem mit PHP anstelle von Java und Google brachte mich hierher. Ich schrieb PHP auf Notepad ++ (nicht normaler Editor) und bemerkte, dass bei jedem Aufruf einer Include-Datei eine zusätzliche weiße Linie angezeigt wurde. Firebug zeigte, dass sich in diesen zusätzlichen Zeilen ein 65279-Zeichen befand. 

Tatsächlich wurden sowohl die Hauptdatei PHP als auch die enthaltenen Dateien in UTF-8 codiert. Notepad ++ hat jedoch auch eine Option zum Kodieren als "UTF-8 ohne Stückliste". Das hat mein Problem gelöst.

Fazit: Die UTF-8-Codierung fügt hier und dort dieses zusätzliche Stücklistenzeichen ein, sofern Sie nicht Ihren Editor anweisen, UTF8 ohne Stückliste zu verwenden.

4
vaelico

Funktioniert gut hier, sogar im Editor bearbeitet. Moral der Geschichte ist, verwenden Sie nicht Notepad. Es gibt wahrscheinlich einen nicht druckbaren Charakter, den Notepad entweder einfügt oder sich glücklich vor Ihnen versteckt.

0
Nick Veys

In Intellij Idea (Einstellungen> Editor> Dateikodierungen) lautete die Projektkodierung "windows-1256". Daher habe ich den folgenden Code verwendet, um statische Zeichenfolgen in utf8 zu konvertieren

protected String persianString(String persianStirng) throws UnsupportedEncodingException {
    return new String(persianStirng.getBytes("windows-1256"), "UTF-8");
}

Jetzt ist es ok! Abhängig von der Dateicodierung sollten Sie "windows-1256" in eine richtige ändern

  • Öffnen Sie Ihre Datei mit WordPad oder einem anderen Editor außer Notepad.

  • Wählen Sie Dateityp als Textdokument - MS-DOS-Format aus

  • Öffnen Sie das Projekt erneut 

0
Satyam Gupta

Um die vorhandenen Antworten mit einer Lösung für Linux-Benutzer zu erweitern :

Um die Stückliste aller .Java-Dateien gleichzeitig zu entfernen, wechseln Sie in Ihr Quellverzeichnis und führen Sie es aus

find -iregex '.*\.Java' -type f -print0 | xargs -0 dos2unix

Erfordert die Installation von find, xargs und dos2unix, die in den meisten Distributionen enthalten sein sollten. Die erste Anweisung findet alle .Java-Dateien im aktuellen Verzeichnis rekursiv, die zweite konvertiert jede von ihnen mit dem dos2unix-Tool, das Zeilenenden konvertieren soll, aber auch die Stückliste entfernt.

Die Konvertierung der Zeilenenden sollte keine Auswirkungen haben, da sie bereits im Linux \n-Format unter Linux vorhanden sein sollte, wenn Sie die Versionskontrolle richtig konfigurieren. Beachten Sie jedoch, dass dies auch der Fall ist, wenn Sie einen der seltenen Fälle haben, in denen dies nicht beabsichtigt ist.

0
Konrad Höffner

Ich hatte das gleiche Problem. Um es zu lösen, öffnete es die Datei in einem Hex-Editor und fand drei "unsichtbare" Bytes am Anfang der Datei. Ich entfernte sie und die Kompilierung funktionierte.

0
Vic