chcp bat java windows unicode utf-8 command-prompt

java - bat - chcp unicode



Java, Unicode, UTF-8 y el símbolo del sistema de Windows (3)

Tengo un archivo jar que se supone que debe leer un archivo codificado en UTF-8 -que escribí en un editor de texto en Windows- y mostrar los caracteres en la pantalla. En OS X y Linux, esto funciona a la perfección. Sin embargo, estoy teniendo problemas para hacer que funcione en Windows ... He definido a un lector y escritor así:

FileInputStream file = new FileInputStream(args[0]); InputStreamReader reader = new InputStreamReader(file, "UTF8"); PrintStream writer = new PrintStream(System.out, true, "UTF8");

También cambié la fuente del símbolo del sistema a Lucida Console y la codificación de caracteres a UTF-8 con chcp 65001 , en ese orden.

Ahora, cuando ejecuto java -jar Read.jar file.txt , el mensaje derrocha esto.

áéí ñóú []óú []

Sin embargo, si ejecuto type file.txt , la solicitud muestra correctamente el contenido del archivo.

áéí ñóú

Intenté guardar mi archivo con y sin lista de materiales, pero eso no ha hecho la diferencia. (UTF-8 ni siquiera necesita BOM porque es falta de endianness, ¿correcto?) Intenté compilar con javac -encoding utf8 *.java , pero ocurre lo mismo.

Me he quedado sin ideas ahora. ¿Alguien se preocupa por ayudar?


Intente usar BufferReader para leer su archivo de esta manera;

BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream(file), "UTF8"));


La página de códigos 65001 está rota. Las funciones stdio de tiempo de ejecución de MS C devuelven recuentos inexactos de bytes leídos y escritos cuando se ejecutan bajo 65001, lo que conduce a comportamientos extraños como este.

No es reparable: no se puede usar de manera confiable la consola de Windows para E / S Unicode desde aplicaciones que usan las funciones C stdlib byte-I / O (que incluyen Java). Puede hackearlo llamando a la función API de Win32 WriteConsoleW para obtener contenido Unicode directamente en la consola, pero luego debe preocuparse por detectar cuándo stdout en realidad es una consola (no redirigido a un archivo).

Esta es una fuente de problemas de larga data que MS no muestra interés en corregir.


Parece que podrías ser tus nuevos personajes. Cuando hago los caracteres de nueva línea en el idioma inglés estándar ISO-8859-1, utilizo una matriz char [] porque los caracteres de Windows ''/ r'' y ''/ n'' y UNIX / Linux son solamente / r como el carácter de nueva línea. Gana 4 bytes, unix 2 bytes. A no, en los documentos de la API para las clases de convertidor de caracteres, el sistema de conversión de codificación puede tener bytes espurios sobrantes para descartar según las codificaciones y los requisitos de tamaño de caracteres.