Avviso "carattere non mappabile per codifica" in Java


112

Attualmente sto lavorando a un progetto Java che emette il seguente avviso durante la compilazione:

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

Non sono sicuro di come SO renderà il carattere prima della data, ma dovrebbe essere un simbolo di copyright e viene visualizzato nell'avviso come un punto interrogativo in un diamante.

Vale la pena notare che il carattere appare correttamente nell'artefatto di output, ma gli avvisi sono un fastidio e il file contenente questa classe potrebbe un giorno essere toccato da un editor di testo che salva la codifica in modo errato ...

Come posso inserire questo carattere nella stringa "copyright" in modo che il compilatore sia soddisfatto e il simbolo venga conservato nel file senza potenziali problemi di ricodifica?


essere interessato a sapere effettivamente quali byte compongono quel carattere di copyright, cioè in hexdump AppDBCore.javaqualche modo dubito del suo \u00a9e invece è qualcosa che funziona parzialmente per te a causa della configurazione del tuo sistema. Il punto interrogativo sopra viene utilizzato per sostituire un carattere in arrivo il cui valore è sconosciuto o non rappresentabile in Unicode hexutf8.com/…
jar

Risposte:


56

Utilizza il formato di escape "\ uxxxx".

Secondo Wikipedia , il simbolo del copyright è unicode U + 00A9 quindi la tua riga dovrebbe essere:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";

13
Fai attenzione ai caratteri \ uNNNN ... vengono analizzati prima di eseguire l'analisi lessicale. Ad esempio, se metti questo commento / * c: \ unit * / nel tuo codice, non verrà più compilato, perché "nit" non è un numero esadecimale corretto.
Peter Štibraný

3
Assolutamente. (Questo è gestito meglio in C #, dove l'escaping Unicode viene applicato solo in determinati contesti, ma poi c'è anche la pericolosa sequenza di escape \ x, che è orribile.)
Jon Skeet

5
Sembra più un cerotto che una cura. Il vero problema sembra essere che stai dicendo a javac di aspettarsi i file sorgente in UTF-8 quando sono realmente in una codifica a byte singolo come ISO-8859-1 o windows-1252.
Alan Moore,

6
@Alan M: Nella mia esperienza, è molto più facile assicurarti di non avere problemi mantenendo i file sorgente in ASCII piuttosto che assicurarti di utilizzare la codifica corretta ovunque la tua sorgente potrebbe essere compilata (Ant, Eclipse, IDEA ecc.).
Jon Skeet,

6
@ Jon, questo è un difetto fondamentale in Java; il fatto che l'unità sorgente Java sia codificata in UTF-8, ISO 8859-1, CP1252, MacRoman, o qualsiasi altra cosa, viene trattata a metadati esterni all'unità sorgente che ne ha bisogno. Questo ti costringe a ricordarti di correggere il tuo file ant o la configurazione di Eclipse, ecc. Come giustamente fai notare, questo è assolutamente il modo peggiore per farlo, perché le informazioni sono fragili e si perdono facilmente. Le lingue che tengono insieme i metadati (metadati di codifica) e i dati (leggi: codice sorgente) in un unico posto sono molto più robusti in questo. È l'unico approccio sano.
tchrist

91

Prova con: javac -encoding ISO-8859-1 nome_file.java


1
Mi piace questa soluzione. Ho aggiunto "-encoding UTF-8" come compilerarg nel mio ant build.xml e ricevo ancora "warning: unmappable character for encoding ASCII". Se lo modifico in "-encoding jjjj" non verrà compilato, lamentandosi "errore: codifica non supportata: jjjj", quindi so che sta riconoscendo UTF-8, ma sembra comunque che i file .java vengano trattati come ascii. Sospiro.
dfrankow

1
Ho provato il parametro "codifica" del task ant javac, stesso problema. Riconosce il parametro, ma poi lo ignora in qualche modo.
dfrankow

20
@dfrankow: devi aggiungere <compilerarg line="-encoding utf-8"/>sotto la <javac>chiamata applicabile nel tuo Build.xmlfile. Questo è un brutto modo per farlo, ma non hai scelta. Vedi il mio lungo commento in alto.
tchrist

Ho avuto lo stesso problema quando ho aggiunto compilearg nello script di formica ha funzionato bene, lo stavo compilando da una riga di comando di Windows, la cosa strana è che stavo costruendo da eclipse è stato visto senza compilearg, sembra che l'eclissi si preoccupi del diritto di codifica.
simonC

Questo mi ha aiutato :) per MAC OSX
Arun Abraham

44

Se stai usando Maven, imposta <encoding>esplicitamente nella configurazione del plugin del compilatore, ad es

<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>

Questo è l'approccio giusto se le persone usano Maven per costruire il loro progetto, grazie per la condivisione.
Shamik

2
Il plugin javadoc si lamenterà anche del carattere non mappabile. È preferibile impostare la project.build.sourceEncodingproprietà.
Emmanuel Bourg

stavo già usando la proprietà project.build.sourceEncoding, ma in qualche modo non è stata mappata correttamente nella proprietà di codifica del compilatore. L'impostazione esplicita ha fatto il trucco
Federico Bonelli

32

Questo mi ha aiutato:

Tutto quello che devi fare è specificare una variabile di ambiente chiamata JAVA_TOOL_OPTIONS. Se si imposta questa variabile su -Dfile.encoding = UTF8, ogni volta che viene avviata una JVM, raccoglierà queste informazioni.

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


wow funziona, aggiungo semplicemente questo al mio .bashrc e ha risolto il mio problema.
cowboi-peng

Ha funzionato alla grande, dalla riga di comando che ho inserito per compilare: javac MyJavaFile.java -encoding utf-8 -cp .;lib\*quindi durante l'esecuzione, non ho avuto bisogno di aggiungere quella parte di codifica extra.
Azurespot

23

inserisci questa riga nel tuo file .gradle sopra Java conf.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   

Si potrebbe desiderare di impostare la codifica compileTestJavae per javadoccosì
Frank Neblung

8

La maggior parte delle volte questo errore di compilazione si verifica durante la compilazione del file Unicode (codificato UTF-8)

javac -encoding UTF-8 HelloWorld.java

e puoi anche aggiungere questa opzione di compilazione al tuo IDE, ad esempio: Intellij idea
(File> impostazioni> Java Compiler) aggiungi come parametro aggiuntivo della riga di comando

inserisci qui la descrizione dell'immagine

-encoding: encoding Imposta il nome della codifica del file sorgente, come EUC-JP e UTF-8 .. Se -encoding non è specificato, viene utilizzato il convertitore predefinito della piattaforma. ( DOC )


8

Gradle Steps

Se stai usando Gradle, puoi trovare la riga che applica il plugin java:

apply plugin: 'java'

Quindi imposta la codifica per l'attività di compilazione su UTF-8:

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

Se hai unit test, probabilmente vorrai compilare anche quelli con UTF-8:

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

Esempio di grado complessivo

Ciò significa che il codice gradle complessivo sarebbe simile a questo:

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

2

Questo ha funzionato per me -

    <?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>

1

Se usi eclipse (Eclipse può inserire il codice utf8 anche se scrivi il carattere utf8. Vedrai il normale carattere utf8 durante la programmazione ma lo sfondo sarà codice utf8);

  1. Seleziona Project
  2. Fare clic con il tasto destro e selezionare Proprietà
  3. Seleziona Risorsa nel pannello delle risorse (menu in alto a destra che si apre dopo 2.)
  4. Puoi vedere nel Pannello delle risorse , Codifica file di testo , selezionare altro che desideri

PS: questo andrà bene se il valore statico nel codice. Ad esempio String test = "İİİİİııııııççççç";


1
La tua descrizione di "Vedrai il normale carattere [a] utf8 quando [stai] programmando ma [lo] sfondo sarà codice utf8" non ha senso. Inoltre, vedi il mio lungo commento in risposta alla domanda sopra.
Cristo

L'ho cambiato in ISO-8859-1, ma ho ancora ricevuto un errore di compilazione sul "carattere non mappabile per la codifica UTF8".
pacoverflow

1

Ho avuto lo stesso problema, dove l'indice dei caratteri riportato nel messaggio di errore java non era corretto. L'ho ristretto ai caratteri virgolette appena prima che la posizione riportata fosse esadecimale 094 (annulla invece di virgolette, ma rappresentata come virgoletta) invece che esadecimale 022. Non appena ho scambiato per la variante esadecimale 022 tutto andava bene.


1

Se si utilizza Maven Build dal prompt dei comandi, è possibile utilizzare anche il seguente comando:

                    mvn -Dproject.build.sourceEncoding=UTF-8

1

Per coloro che si chiedono perché questo accade su alcuni sistemi e non su altri (con la stessa sorgente, parametri di compilazione e così via), controlla la tua LANGvariabile d'ambiente . Ottengo l'avviso / errore quando LANG=C.UTF-8, ma non quando LANG=en_US.UTF-8.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.