Algunos compiladores fallaron en caracteres no ASCII en JavaDoc y el código fuente de los comentarios.
Esto es probable porque el compilador supone que la entrada es UTF-8, y hay secuencias UTF-8 no válidas en el archivo de origen. Que estos aparecen en los comentarios en el editor de código fuente es irrelevante porque el lexer (que distingue los comentarios de otros tokens) nunca se ejecuta. La falla ocurre mientras la herramienta intenta convertir bytes en caracteres antes de que se ejecute el lexer.
La página man
para javac
y javadoc
dicen
-encoding name
Specifies the source file encoding name, such as
EUCJIS/SJIS. If this option is not specified, the plat-
form default converter is used.
lo que la ejecución javadoc
con la bandera de codificación
javadoc -encoding <encoding-name> ...
después de reemplazar <encoding-name>
con la codificación que ha utilizado para sus archivos de origen debería hacer que use la codificación correcta.
Si tiene más de una codificación utilizada dentro de un grupo de archivos de origen que necesita compilar a la vez, debe arreglarla primero y establecer una única codificación uniforme para todos los archivos fuente. Realmente debería usar UTF-8 o apegarse a ASCII.
Cuál es la corriente (Java 7) y el futuro (Java 8 y más allá) prácticas con respecto a Unicode en los archivos fuente de Java?
El algoritmo para resolver un archivo de código fuente en Java es
- bytes Collect
- Convertir bytes de caracteres (UTF-16) unidades de código utilizando alguna de codificación.
- Reemplace todas las secuencias de
'\\'
'u'
seguidas de cuatro dígitos hexadecimales con la unidad de código correspondiente a esos dígitos hexadecimales. Error al salir si hay un "\u"
no seguido por cuatro dígitos hexadecimales.
- Lex los caracteres en tokens.
- Analiza los tokens en clases.
La práctica actual y anterior es que el paso 2, la conversión de bytes a 16 UTF-unidades de código, depende de la herramienta que se está cargando la unidad de compilación (archivo de origen), pero el estándar de facto para las interfaces de línea de comandos es para usar la bandera -encoding
.
Después de que ocurra la conversión, el lenguaje exige que las secuencias de estilo \uABCD
se conviertan a unidades de código UTF-16 (paso 3) antes de leer y analizar.
Por ejemplo:
int a;
\u0061 = 42;
es un par válido de sentencias Java. Cualquier herramienta de código fuente de Java deben, después de convertir bytes a caracteres, pero antes de analizar, buscar secuencias \ uABCD y convertirlos lo que este código se convierte en
int a;
a = 42;
antes de analizar. Esto sucede independientemente de dónde se produce la secuencia \ uABCD.
Este proceso se ve algo como
- Obtener bytes:
[105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]
- Convertir bytes de caracteres:
['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
- Reemplazar Unicode escapa:
['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']
- Lex:
["int", "a", ";", "a", "=", "42", ";"]
- de análisis:
(Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))
caso de todos los caracteres no ASCII se escaparon en JavaDoc con HTML y escapar; -como los códigos?
No es necesario, excepto caracteres HTML especiales como '<'
que desea que aparezcan literalmente en la documentación. Puede usar las secuencias \uABCD
dentro de los comentarios de javadoc. proceso de Java \u....
antes de analizar el archivo fuente para que puedan aparecer dentro de las cadenas, comentarios, en cualquier lugar realmente.Es por eso que
System.out.println("Hello, world!\u0022);
es una declaración válida de Java.
/** @return \u03b8 in radians */
es equivalente a
/** @return θ in radians */
como lo que se refiere javadoc.
Pero lo que sería el equivalente de Java //
comentario?
Puede utilizar //
comentarios en java, pero sólo se ve de Javadoc dentro /**...*/
comentarios para documentación. //
comentarios no son portadores de metadatos.
Una ramificación de manejo de \uABCD
secuencias de Java es que aunque
// Comment text.\u000A System.out.println("Not really comment text");
se parece a una sola línea de comentario, y muchos entornos de desarrollo pondrá de relieve que, como tal, no lo es.
Eche un vistazo a [esto] (http://en.wikibooks.org/wiki/Java_Programming/Syntax/Unicode_Source) (estoy seguro de que esto lo especifica JLS). –
En realidad, puede usar cualquier codificación que desee en sus archivos fuente, solo necesita indicar cuál eligió para el compilador Java y la línea de comandos javadoc. –
OK, ¡este es el tipo de información que estoy buscando! Primero, esto es genial, y no estaba enterado de esto. Entonces, ahora solo necesito averiguar cómo hacer que el compilador sepa qué conjunto de caracteres usar ... por ejemplo, el CDK se compila usando Ant, Maven y Eclipse ... –