Warnung "Nicht zuordnbares Zeichen zum Codieren" in Java

112

Ich arbeite derzeit an einem Java-Projekt, das beim Kompilieren die folgende Warnung ausgibt:

/src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8
    [javac]         String copyright = "� 2003-2008 My Company. All rights reserved.";

Ich bin nicht sicher, wie SO das Zeichen vor dem Datum rendern wird, aber es sollte ein Copyright-Symbol sein und wird in der Warnung als Fragezeichen in einem Diamanten angezeigt.

Es ist erwähnenswert, dass das Zeichen im Ausgabeartefakt korrekt angezeigt wird, aber die Warnungen sind ein Ärgernis und die Datei, die diese Klasse enthält, kann eines Tages von einem Texteditor berührt werden, der die Codierung falsch speichert ...

Wie kann ich dieses Zeichen in die Zeichenfolge "copyright" einfügen, damit der Compiler zufrieden ist und das Symbol in der Datei ohne mögliche Probleme bei der Neucodierung erhalten bleibt?

Seanhodges
quelle
Seien Sie daran interessiert, tatsächlich zu wissen, aus welchen Bytes dieses Copyright-Zeichen besteht, dh hexdump AppDBCore.javaich bezweifle es irgendwie \u00a9und ist stattdessen etwas, das aufgrund Ihres System-Setups teilweise für Sie funktioniert. Das Fragezeichen oben wird verwendet, um ein eingehendes Zeichen zu ersetzen, dessen Wert in Unicode hexutf8.com/…
jar

Antworten:

56

Verwenden Sie das Escape-Format "\ uxxxx".

Laut Wikipedia lautet das Copyright-Symbol Unicode U + 00A9, daher sollte Ihre Zeile lauten:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
Jon Skeet
quelle
13
Seien Sie vorsichtig mit \ uNNNN-Zeichen ... sie werden analysiert, bevor Sie eine lexikalische Analyse durchführen. Wenn Sie beispielsweise diesen Kommentar / * c: \ unit * / in Ihren Code einfügen, wird er nicht mehr kompiliert, da "nit" keine korrekte Hex-Nummer ist.
Peter Štibraný
3
Absolut. (Dies wird besser in C # gehandhabt, wo Unicode-Escape nur in bestimmten Kontexten angewendet wird - aber dann gibt es auch die gefährliche \ x-Escape-Sequenz, die schrecklich ist.)
Jon Skeet
5
Das klingt eher nach einem Pflaster als nach einer Heilung. Das eigentliche Problem scheint zu sein, dass Sie javac anweisen, Quelldateien in UTF-8 zu erwarten, wenn diese tatsächlich in einer Einzelbyte-Codierung wie ISO-8859-1 oder Windows-1252 vorliegen.
Alan Moore
6
@Alan M: Nach meiner Erfahrung ist es viel einfacher sicherzustellen, dass Sie kein Problem haben, wenn Sie Quelldateien in ASCII speichern, als sicherzustellen, dass Sie überall dort , wo Ihre Quelle kompiliert wird, die richtige Codierung verwenden (Ant, Eclipse, IDEE etc).
Jon Skeet
6
@ Jon, das ist ein grundlegender Fehler in Java; Die Tatsache, dass die Java-Quelleneinheit in UTF-8, ISO 8859-1, CP1252, MacRoman oder was auch immer codiert ist, wird bei Metadaten außerhalb der Quelleneinheit behandelt, die sie benötigt. Dies zwingt Sie dazu, daran zu denken, Ihre Ant-Datei oder Eclipse-Konfiguration usw. zu reparieren. Wie Sie zu Recht betonen, ist dies der absolut schlechteste Weg, da die Informationen zerbrechlich sind und leicht verloren gehen. Sprachen, die die Metadaten (Codierungsmetadaten) und die Daten (gelesen: Quellcode) an einem Ort zusammenhalten, sind dabei wesentlich robuster. Es ist der einzig vernünftige Ansatz.
Tchrist
91

Versuchen Sie es mit: javac -encoding ISO-8859-1 file_name.java

Fernando Nah
quelle
1
Ich mag diese Lösung. Ich habe "-encoding UTF-8" als Compilerarg in meiner ant build.xml hinzugefügt und erhalte immer noch "Warnung: Nicht zuordnbares Zeichen zum Codieren von ASCII". Wenn ich es auf "-encoding jjjj" ändere, wird es nicht kompiliert und beschwert sich über "Fehler: nicht unterstützte Codierung: jjjj". Ich weiß also, dass es UTF-8 erkennt, aber es scheint immer noch .java-Dateien als ASCII zu behandeln. Seufzer.
dfrankow
1
Ich habe den "Codierungs" -Parameter der Ant Javac-Task ausprobiert, das gleiche Problem. Es erkennt den Parameter, ignoriert ihn dann aber irgendwie.
dfrankow
20
@dfrankow: Sie müssen <compilerarg line="-encoding utf-8"/>unter dem entsprechenden <javac>Aufruf in Ihrer Build.xmlDatei hinzufügen . Dies ist ein schlechter Weg, aber Sie haben keine Wahl. Siehe meinen langen Kommentar oben.
Tchrist
Ich hatte das gleiche Problem, als ich das Compilearg in das Ant-Skript einfügte, das funktionierte. Es funktionierte in Ordnung. Ich habe es aus einer Windows-Befehlszeile erstellt. Das Seltsame ist, dass ich aus Eclipse erstellt habe, dass es sich ohne das Compilearg verzog des Kodierungsrechts.
SimonC
Das hat mir geholfen :) für MAC OSX
Arun Abraham
44

Wenn Sie Maven verwenden, legen Sie dies <encoding>explizit in der Konfiguration des Compiler-Plugins fest, z

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
Thomas Leonard
quelle
Dies ist der richtige Ansatz, wenn Benutzer Maven zum Erstellen ihres Projekts verwenden, danke für das Teilen.
Shamik
2
Das Javadoc-Plugin wird sich auch über den nicht zuordenbaren Charakter beschweren. Es ist vorzuziehen, die project.build.sourceEncodingEigenschaft festzulegen.
Emmanuel Bourg
Ich habe bereits die Eigenschaft project.build.sourceEncoding verwendet, aber irgendwie wurde sie der Compiler-Codierungseigenschaft nicht richtig zugeordnet. Das explizite Einstellen hat den Trick getan
Federico Bonelli
32

Das hat mir geholfen:

Sie müssen lediglich eine Umgebungsvariable mit dem Namen JAVA_TOOL_OPTIONS angeben. Wenn Sie diese Variable auf -Dfile.encoding = UTF8 setzen, werden diese Informationen bei jedem Start einer JVM abgerufen.

Quelle: http://whatiscomingtomyhead.wordpress.com/2012/01/02/get-rid-of-unmappable-character-for-encoding-cp1252-once-and-for-all/

Nightlyop
quelle
wow es funktioniert Ich füge dies einfach zu meiner .bashrc hinzu und es hat mein Problem behoben.
Cowboi-Peng
Hat über die Befehlszeile, die ich zum Erstellen eingegeben habe, hervorragend javac MyJavaFile.java -encoding utf-8 -cp .;lib\*funktioniert : Beim Ausführen musste ich diesen zusätzlichen Codierungsteil nicht hinzufügen.
Azurespot
23

Fügen Sie diese Zeile in Ihre Datei .gradle über der Java-Konf. ein.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   
Alobes5
quelle
Sie könnten die Codierung für festlegen möchten compileTestJavaund javadocauch
Frank Neblung
8

Meistens tritt dieser Kompilierungsfehler beim Kompilieren von Unicode-Dateien (UTF-8-codiert) auf

javac -encoding UTF-8 HelloWorld.java

Außerdem können Sie diese Kompilierungsoption zu Ihrer IDE hinzufügen, z. B.: Intellij-Idee
(Datei> Einstellungen> Java-Compiler) als zusätzlichen Befehlszeilenparameter hinzufügen

Geben Sie hier die Bildbeschreibung ein

-encoding: encoding Legt den Codierungsnamen der Quelldatei fest, z. B. EUC-JP und UTF-8. Wenn -encoding nicht angegeben ist, wird der Plattform-Standardkonverter verwendet. ( DOC )

Alupotha
quelle
8

Gradle Schritte

Wenn Sie Gradle verwenden, finden Sie die Zeile, in der das Java-Plugin angewendet wird:

apply plugin: 'java'

Stellen Sie dann die Codierung für die Kompilierungsaufgabe auf UTF-8 ein:

compileJava {options.encoding = "UTF-8"}   

Wenn Sie Unit-Tests haben, möchten Sie diese wahrscheinlich auch mit UTF-8 kompilieren:

compileTestJava {options.encoding = "UTF-8"}

Gesamtes Gradle-Beispiel

Dies bedeutet, dass der gesamte Gradle-Code ungefähr so ​​aussehen würde:

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}
compileTestJava {options.encoding = "UTF-8"}
Luke Machowski
quelle
2

Das hat bei mir funktioniert -

    <?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="compile">
    <target name="compile">
        <javac srcdir="src" destdir="classes" 
                           encoding="iso-8859-1" debug="true" />
    </target>
</project>
Dxx0
quelle
1

Wenn Sie Eclipse verwenden (Eclipse kann utf8-Code für Sie einfügen, selbst wenn Sie utf8-Zeichen schreiben. Beim Programmieren wird normales utf8-Zeichen angezeigt, der Hintergrund ist jedoch utf8-Code).

  1. Wählen Sie Projekt
  2. Klicken Sie mit der rechten Maustaste und wählen Sie Eigenschaften
  3. Wählen Sie Ressource auf Resource Panel (oben rechts Menü , das nach dem 2. geöffnet)
  4. Sie können live in Resource Panel , Textdatei Encoding , wählen Sie andere , die Sie wollen

PS: Dies ist in Ordnung, wenn Sie einen statischen Wert im Code haben. Zum Beispiel String test = "İİİİİııııııçççççç";

baybora.oren
quelle
1
Ihre Beschreibung von "Sie werden beim Programmieren ein normales [a] utf8-Zeichen sehen, aber [der] Hintergrund wird utf8-Code sein" macht keinen Sinn. Siehe auch meinen langen Kommentar als Antwort auf die obige Frage.
Tchrist
Ich habe es in ISO-8859-1 geändert, aber immer noch einen Kompilierungsfehler bezüglich "Nicht zuordnbares Zeichen zum Codieren von UTF8" erhalten.
Pacoverflow
1

Ich hatte das gleiche Problem, bei dem der in der Java-Fehlermeldung angegebene Zeichenindex falsch war. Ich habe es auf die doppelten Anführungszeichen eingegrenzt, kurz bevor die gemeldete Position Hex 094 (Abbrechen anstelle von Anführungszeichen, aber als Anführungszeichen dargestellt) anstelle von Hex 0222 war. Sobald ich gegen die Hex 022-Variante getauscht habe, war alles in Ordnung.

Kelvin Goodson
quelle
1

Wenn Sie Maven Build über die Eingabeaufforderung verwenden, können Sie auch den folgenden Befehl verwenden:

                    mvn -Dproject.build.sourceEncoding=UTF-8
5122014009
quelle
1

Wenn Sie sich fragen, warum dies auf einigen Systemen und nicht auf anderen (mit derselben Quelle, denselben Build-Parametern usw.) geschieht, überprüfen Sie Ihre LANGUmgebungsvariable . Ich bekomme die Warnung / den Fehler wann LANG=C.UTF-8, aber nicht wann LANG=en_US.UTF-8.

Jakar
quelle