Hi,

(1)
Yes, the changes don't update the underlying console encoding. There is 
guidance that apps should not change the console encoding as it would affect 
other commands in the same console. A script must explicitly use chcp to change 
the codepage.

The change has a new option "file.encoding.unicode" to avoid changing the 
existing ones: "file.encoding" and "sun.jnu.encoding"; as they are used in 
several places and touching them could break backward compatibility.

The two system properties: "file.encoding" and "sun.jnu.encoding" are set by 
getEncodingInternal(). Then, during initialization file.encoding is set with 
the value of sun.jnu.encoding, so the two properties have the same value.

These properties are used to set the default charset for:
*       "platform strings" encoding
*       output streams (encoding of System.out is initialized by this default 
charset)
*       replacing of unsafe symbols on URL
*       ftp client
*       network client
Any Java application could rely on these properties as well.

On OSX and Linux both these properties are set according to currently active 
locale, while on Windows they are filled with system default locale.

This behavior could be observed with this simple test:

main.java:
class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("file.encoding=" + 
System.getProperty("file.encoding"));
        System.out.println("sun.jnu.encoding=" + 
System.getProperty("sun.jnu.encoding"));
    }
}

Linux test:
$ sudo localedef -c -i ru_RU -f CP1251 ru_RU.CP1251

$ javac main.java

$ java Main
file.encoding=UTF-8
sun.jnu.encoding=UTF-8

$ export LC_ALL=ru_RU.cp1251

$ java Main
file.encoding=CP1251
sun.jnu.encoding=CP1251

Windows test:
>javac main.java

>java Main
file.encoding=Cp1252
sun.jnu.encoding=Cp1252

>chcp 65001
Active code page: 65001

>java Main
file.encoding=Cp1252
sun.jnu.encoding=Cp1252


So when default system locale differs from the active one, we have different 
behavior on Linux and Windows. The new options allow a windows user to select 
the same behavior that one would expect on unix. The switches can certainly be 
removed, if the compatibility impact is acceptable.

(2)
The defaultUnicodeCharset() method because it is called from java.io.Console() 
constructor as well as from LauncherHelper. So its scope should be wider than 
just LauncherHelper.java.

Kirk and Valery

> -----Original Message-----
> From: Xueming Shen [mailto:xueming.s...@oracle.com]
> Sent: Saturday, July 11, 2015 11:51 AM
> 
> Hi Kirk,
> 
> Two questions
> 
> (1) Why do you need to change the "encoding" used by the java.io.Console 
> class. My understanding
>       is that the console encoding is specifically used to "talk" to the 
> underlying terminal, it should just
>       be the one used by the underlying terminal/console. I don't think the 
> proposed change updates
>       the underlying console encoding (something like chcp)  when 
> -Dwindows.UnicodeConsole=true
>       specified, if I read the webrev correctly. Instead, the 
> Java_java_io_Console_encoding() probably
>       need to be updated to return utf8 if the cp == 65001, so if the 
> underlying terminal/console is
>       using cp65001, the java.io.Console should encode/decode in utf8.
>       I would assume the encoding of java.io.Condole should have nothing to 
> do with using
>       GetCommandLIneW() to parse the arguments in unicode in launcher?
> 
> (2) Why do you need a defaultUnicodeCharset() in Charset class? Seems to me 
> the scope should/could
>       be limited inside LauncherHelper.java?
> 
> Thanks,
> -Sherman
> 
> 

Reply via email to