Advertencia de "carácter no mapeable para codificación" en Java

112

Actualmente estoy trabajando en un proyecto Java que emite la siguiente advertencia cuando compilo:

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

No estoy seguro de cómo SO representará el carácter antes de la fecha, pero debería ser un símbolo de derechos de autor y se muestra en la advertencia como un signo de interrogación en un diamante.

Vale la pena señalar que el carácter aparece en el artefacto de salida correctamente, pero las advertencias son una molestia y el archivo que contiene esta clase puede que algún día sea tocado por un editor de texto que guarde la codificación incorrectamente ...

¿Cómo puedo inyectar este carácter en la cadena "copyright" para que el compilador esté contento y el símbolo se conserve en el archivo sin posibles problemas de recodificación?

seanhodges
fuente
estar interesado en saber realmente qué bytes componen ese carácter de copyright, es decir hexdump AppDBCore.java, de alguna manera dudo que sea \u00a9y, en cambio, es algo que funciona parcialmente para usted debido a la configuración de su sistema. El signo de interrogación anterior se usa para reemplazar un carácter entrante cuyo valor es desconocido o irrepresentable en Unicode hexutf8.com/…
jar

Respuestas:

56

Utilice el formato de escape "\ uxxxx".

Según Wikipedia , el símbolo de derechos de autor es unicode U + 00A9, por lo que su línea debería leer:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
Jon Skeet
fuente
13
Tenga cuidado con los caracteres \ uNNNN ... se analizan antes de realizar el análisis léxico. Por ejemplo, si pone este comentario / * c: \ unit * / en su código, no se compilará más, porque "nit" no es el número hexadecimal correcto.
Peter Štibraný
3
Absolutamente. (Esto se maneja mejor en C #, donde el escape Unicode solo se aplica en ciertos contextos, pero también está la peligrosa secuencia de escape \ x, que es terrible).
Jon Skeet
5
Esto suena más a una curita que a una cura. El problema real parece ser que le está diciendo a javac que espere archivos fuente en UTF-8 cuando en realidad están en una codificación de un solo byte como ISO-8859-1 o windows-1252.
Alan Moore
6
@Alan M: En mi experiencia, es mucho más fácil asegurarse de que no tendrá problemas manteniendo los archivos fuente en ASCII que asegurarse de usar la codificación correcta en todos los lugares donde se compila su fuente (Ant, Eclipse, IDEA, etc.).
Jon Skeet
6
@Jon, esa es una falla fundamental en Java; el hecho de que la unidad fuente de Java esté codificada en UTF-8, ISO 8859-1, CP1252, MacRoman o lo que sea, se trata en metadatos externos a la unidad fuente que lo necesita. Esto te obliga a recordar arreglar tu archivo ant o configuración de Eclipse, etc. Como bien has señalado, esta es la peor forma de hacerlo, porque la información es frágil y se pierde fácilmente. Los lenguajes que mantienen los metadatos (codificación de metadatos) y los datos (leer: código fuente) juntos en un solo lugar son mucho más sólidos en esto. Es el único enfoque sensato.
tchrist
91

Pruebe con: javac -encoding ISO-8859-1 file_name.java

Fernando Nah
fuente
1
Me gusta esta solucion Agregué "-encoding UTF-8" como un compilerarg en mi ant build.xml y todavía recibo "advertencia: carácter no mapeable para codificar ASCII". Si lo modifico a "-encoding jjjj" no se compilará, quejándose "error: unsupported encoding: jjjj", entonces sé que está reconociendo UTF-8, pero todavía parece ser tratado como archivos .java como ascii. Suspiro.
dfrankow
1
Probé el parámetro "codificación" de la tarea ant javac, el mismo problema. Reconoce el parámetro, pero luego lo ignora de alguna manera.
dfrankow
20
@dfrankow: debe agregar <compilerarg line="-encoding utf-8"/>debajo de la <javac>llamada correspondiente en su Build.xmlarchivo. Esta es una mala forma de hacerlo, pero no tiene otra opción. Vea mi comentario largo en la parte superior.
tchrist
Tuve el mismo problema cuando agregué el archivo de compilación en el script de la hormiga, funcionó bien, lo estaba construyendo desde una línea de comando de Windows, lo extraño es que estaba construyendo desde el eclipse, se movió sin el archivo de compilación, parece que ese eclipse le importa del derecho de codificación.
simonC
Esto me ayudó :) para MAC OSX
Arun Abraham
44

Si está utilizando Maven, establezca <encoding>explícitamente en la configuración del complemento del compilador, por ejemplo

<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
fuente
Este es el enfoque correcto si la gente está usando maven para construir su proyecto, gracias por compartir.
Shamik
2
El complemento javadoc también se quejará del carácter no mapeable. Es preferible configurar la project.build.sourceEncodingpropiedad.
Emmanuel Bourg
Ya estaba usando la propiedad project.build.sourceEncoding, pero de alguna manera no se asignó correctamente a la propiedad de codificación del compilador. Establecerlo explícitamente funcionó
Federico Bonelli
32

Esto me ayudó:

Todo lo que necesita hacer es especificar una variable de entorno llamada JAVA_TOOL_OPTIONS. Si establece esta variable en -Dfile.encoding = UTF8, cada vez que se inicia una JVM, recogerá esta información.

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

nightlyop
fuente
wow, funciona, solo agrego esto a mi .bashrc, y solucionó mi problema.
cowboi-peng
Funcionó muy bien, desde la línea de comando que ingresé para compilar: javac MyJavaFile.java -encoding utf-8 -cp .;lib\*luego, cuando lo ejecuté, no necesité agregar esa parte de codificación adicional.
Azurespot
23

ponga esta línea en su archivo .gradle arriba de la configuración de Java.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   
Alobes5
fuente
Es posible que desee definir la codificación compileTestJavay javadocasí
Frank Neblung
8

La mayoría de las veces, este error de compilación se produce cuando se compila un archivo Unicode (codificado en UTF-8).

javac -encoding UTF-8 HelloWorld.java

y también puede agregar esta opción de compilación a su IDE, por ejemplo: Intellij idea
(Archivo> configuración> Compilador de Java) agregar como parámetro de línea de comando adicional

ingrese la descripción de la imagen aquí

-encoding: encoding Establece el nombre de codificación del archivo de origen, como EUC-JP y UTF-8 .. Si no se especifica -encoding, se utiliza el convertidor predeterminado de la plataforma. ( DOC )

Alupotha
fuente
8

Pasos de Gradle

Si está utilizando Gradle, puede encontrar la línea que aplica el complemento de Java:

apply plugin: 'java'

Luego, configure la codificación para la tarea de compilación en UTF-8:

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

Si tiene pruebas unitarias, probablemente también desee compilarlas con UTF-8:

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

Ejemplo general de Gradle

Esto significa que el código general de Gradle se vería así:

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

Esto funcionó para mí

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

Si usa eclipse (Eclipse puede poner código utf8 para usted incluso si escribe el carácter utf8. Verá el carácter utf8 normal cuando programe, pero el fondo será el código utf8);

  1. Seleccionar proyecto
  2. Haga clic derecho y seleccione Propiedades
  3. Seleccione Recurso en el Panel de recursos (menú superior derecho que se abrió después de 2.)
  4. Puede ver en el Panel de recursos , Codificación de archivos de texto , seleccione otro que desee

PD: esto estará bien si tiene un valor estático en el código. Por ejemplo, String test = "İİİİİıııııççççç";

baybora.oren
fuente
1
Su descripción de “Verá [un] carácter utf8 normal cuando [esté] programando pero [el] fondo será el código utf8” no tiene sentido. Además, vea mi comentario largo en respuesta a la pregunta anterior.
tchrist
Lo cambié a ISO-8859-1, pero todavía tengo un error de compilación sobre "carácter no mapeable para codificar UTF8".
pacoverflow
1

Tuve el mismo problema, donde el índice de caracteres informado en el mensaje de error de Java era incorrecto. Lo reduje a los caracteres de comillas dobles justo antes de que la posición informada fuera hexadecimal 094 (cancelar en lugar de citar, pero representada como una cita) en lugar de hexadecimal 022. Tan pronto como cambié por la variante hexadecimal 022, todo estuvo bien.

Kelvin Goodson
fuente
1

Si uno está usando Maven Build desde el símbolo del sistema, también puede usar el siguiente comando:

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

Para aquellos que se preguntan por qué sucede esto en algunos sistemas y no en otros (con la misma fuente, parámetros de compilación, etc.), verifique su LANGvariable de entorno . Recibo la advertencia / error cuando LANG=C.UTF-8, pero no cuando LANG=en_US.UTF-8.

jakar
fuente