Console input (win), how is the charset convertion working?
Code below, non-ascii chars output garbage – InputStreamReader in the below example doesn’t take charset as an argument.
BufferedReader console = new BufferedReader( new InputStreamReader(System.in));
String inp = console.readLine();
System.out.println(inp.toUpperCase());
Being os-independent, how does Java solve all different possible charset configurations regarding console prompt input?
Actually, Java doesn’t handle this problem at all.
It simply assumes that console encoding is the same as the system default encoding. This assumption is wrong on Windows systems, therefore Java doesn’t provide good solution to perform correct console IO with respect to non-ascii characters on Windows.
Possible solutions are:
Use
System.console()introduced in Java 6:Note that
System.console()can returnnullwhen you program run with redirected IO, for example, in IDE. You need a fallback for this case.Specify console encoding explicitly:
As far as I know, there are no good ways to determine actual console encoding programmatically without native code.
Specify console encoding as default encoding using
file.encodingproperty, so that the assumption that console IO uses default encoding would be correct: