es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Caracteres chinos de Netbeans en los argumentos de ejecución de propiedades del proyecto Java.

Estoy escribiendo un programa en Java de Netbeans para manejar caracteres chinos en los argumentos. Puedo usar códigos Unicode y caracteres chinos en mi código y se compilan y se muestran correctamente en la consola. Sin embargo, cuando paso los caracteres chinos a través de los argumentos de ejecución de las propiedades del proyecto, todos se convierten en “?????”. Ya he configurado la codificación de mi proyecto a UTF-8 y las opciones de VM a -Dfile.encoding=UTF-8. Aquí está mi código, por favor, ayuda.

public static void main(String[] args) {
    String test = "\u5973\u58eb";
    System.out.println(test);      //funciona
    String test2 = "女士2";
    System.out.println(test2);     //funciona
    System.out.println(args[0]);   //copio y pego test2 como argumento, no funciona, muestra ??
}

Nota: Uso jdk 1.8.0_202, Ant v1.10.4, Windows 10, Netbeans 10, las fuentes utilizadas para la salida de Netbeans y la terminal son monospaced14, el proyecto se crea utilizando la “aplicación Java” de Netbeans. El problema ocurre al ejecutar dentro de Netbeans o en el símbolo del sistema de Windows chcp 65001, ambos con -Dfile.encoding=UTF-8.

Nota: Con el consejo de skomisa, también probé con “usar unicode utf8 para soporte de idiomas en todo el mundo” de Windows marcado. También me alejé de Netbeans pero utilicé el jar para ejecutar en el símbolo del sistema de Windows con chcp 65001.

D:\.......>java -cp dist/myjar.jar -Dfile.encoding=UTF8 java.mypackage.TestUTF8 女士
女士
女士2
女士

D:\.......>java -cp dist/myjar.jar java.mypackage.TestUTF8 女士
??
??2
女士

Por lo tanto, con -Dfile.encoding=UTF8 (primera ejecución), la cadena constante en el código funciona mientras que los argumentos no. Sin -Dfile.encoding (segunda ejecución), las constantes en el código no funcionan mientras que los argumentos sí funcionan. Pero necesito ambos. Tengo una cadena constante en chino en mi programa, así como en los argumentos del programa. ¿Alguien puede decirme qué se puede hacer, por favor?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para pasar caracteres chinos a través de los argumentos de ejecución de las propiedades del proyecto en un programa Java de Netbeans.

    Parece que el problema radica en que la ventana de comandos de Windows no puede mostrar correctamente los caracteres chinos. A pesar de establecer la codificación del proyecto en UTF-8 y especificar -Dfile.encoding=UTF-8 en las opciones de la máquina virtual, pasar caracteres chinos a través de los argumentos de ejecución de las propiedades del proyecto aún hace que se conviertan en “????”.

    Una solución a este problema es utilizar un método diferente para ejecutar el programa Java, como a través de la terminal de un sistema basado en Unix, que puede manejar los caracteres Unicode sin problemas. Otra solución es establecer la configuración regional del sistema en una que admita caracteres chinos, como chino (simplificado, China) o chino (tradicional, Taiwán), y ejecutar el programa a través de la ventana de comandos con la opción -Dfile.encoding=UTF-8.

    Si estas soluciones no son factibles, otra opción es codificar los caracteres chinos como secuencias de escape Unicode en los argumentos del programa. Por ejemplo, en lugar de pasar “女士” como argumento, puedes pasar “\u5973\u58eb” en su lugar.

    Aquí tienes una versión actualizada del código Java que demuestra este enfoque:

    public class MainClass {
        public static void main(String[] args) {
            String test = "\u5973\u58eb";
            System.out.println(test);   //funciona
            String test2 = "女士2";
            System.out.println(test2);  //funciona
            String test3 = args[0];
            System.out.println(test3);  //funciona si se pasa como \u5973\u58eb
        }
    }
    

    Para pasar “女士” como argumento, deberías invocar el programa de la siguiente manera:

    java -Dfile.encoding=UTF-8 -cp ruta/al/programa.jar MainClass "\u5973\u58eb"
    

    Esto debería mostrar “女士” correctamente en la salida de la consola.

Comments are closed.