Re: JEP proposed to target JDK 18: 400: UTF-8 by Default

2021-08-19 Thread Simon Nash

On 19/08/2021 07:40, Alan Bateman wrote:
Yes, if there is code that really wants to use the native encoding and run of wide range of JDK releases without the using COMPAT then it can read the value 
of native.encoding and use Charset.defaultCharset if the property is not set.


-Alan.


Thanks for this suggestion. This should work for my situation.

Simon


Re: JEP proposed to target JDK 18: 400: UTF-8 by Default

2021-08-19 Thread Alan Bateman

On 18/08/2021 22:44, Naoto Sato wrote:

On 8/18/21 2:03 PM, Simon Nash wrote:
I am the developer of a fairly large application that uses file I/O 
extensively. In most cases, the charset should be UTF-8 and I have 
used an explicit charset parameter on all method invocations where 
this applies. In some cases, the charset needs to be the platform 
default charset to produce output that is readable by other programs 
or by a user (for example, Windows-1252 on some versions of Windows).


In the cases that need the platform default charset, I have omitted 
the charset (intentionally, not carelessly or accidentally). If the 
behaviour changes in these cases, it will produce unexpected results 
for users.


In preparation for JEP 400, we have provided a new system property 
that retrieves the native encoding name in JDK17:


https://bugs.openjdk.java.net/browse/JDK-8265989

Apps that have luxury to make code base change can use the property to 
retrieve the native encoding, then use it to replace no-arg I/O 
constructors to the explicit equivalent ones.


Yes, if there is code that really wants to use the native encoding and 
run of wide range of JDK releases without the using COMPAT then it can 
read the value of native.encoding and use Charset.defaultCharset if the 
property is not set.


-Alan.


Re: JEP proposed to target JDK 18: 400: UTF-8 by Default

2021-08-18 Thread Naoto Sato

On 8/18/21 2:03 PM, Simon Nash wrote:
I am the developer of a fairly large application that uses file I/O 
extensively. In most cases, the charset should be UTF-8 and I have used 
an explicit charset parameter on all method invocations where this 
applies. In some cases, the charset needs to be the platform default 
charset to produce output that is readable by other programs or by a 
user (for example, Windows-1252 on some versions of Windows).


In the cases that need the platform default charset, I have omitted the 
charset (intentionally, not carelessly or accidentally). If the 
behaviour changes in these cases, it will produce unexpected results for 
users.


In preparation for JEP 400, we have provided a new system property that 
retrieves the native encoding name in JDK17:


https://bugs.openjdk.java.net/browse/JDK-8265989

Apps that have luxury to make code base change can use the property to 
retrieve the native encoding, then use it to replace no-arg I/O 
constructors to the explicit equivalent ones.




I could try to find all the method invocations that currently use the 
implicit default charset, although I have no idea how to do this other 
than reading every line of code. The problems with this are 1) that I 
would almost certainly miss some invocations that need to be changed and 
2) more seriously, from what I have seen in the JEP I don't think there 
is a way to update these method invocations that works exactly as at 
present on all versions of Java back to JDK 8 and provides the same 
behaviour on JDK 18. This is because (as far as I can tell) there is no 
API call that returns the "old-style" platform default charset and can 
be used on all JDK versions from JDK 8 to JDK 18. Adding a -D option 
when the application is started isn't possible in some contexts such as 
launching the application from a Windows executable jar file association.


If I could make a single API call when the application is first started 
to force backward-compatible behaviour in all cases, this would solve 
the problem. This feels very much like a "hack" and I would much prefer 
a clean solution but it would be better than nothing.


I am reluctant to provide such a single API call which has the same 
effect as `COMPAT`, as it will become less meaningful when UTF-8 as 
default sinks in.


Naoto


Re: JEP proposed to target JDK 18: 400: UTF-8 by Default

2021-08-18 Thread Simon Nash

On 18/08/2021 20:49, Naoto Sato wrote:

Hi Simon,

Please post your comments at core-libs-dev mailing list, where the discussion 
should take place.

Naoto


My apologies that I am late into the discussion of this JEP.

I am the developer of a fairly large application that uses file I/O extensively. In most cases, the charset should be UTF-8 and I have used an explicit charset 
parameter on all method invocations where this applies. In some cases, the charset needs to be the platform default charset to produce output that is readable 
by other programs or by a user (for example, Windows-1252 on some versions of Windows).


In the cases that need the platform default charset, I have omitted the charset (intentionally, not carelessly or accidentally). If the behaviour changes in 
these cases, it will produce unexpected results for users.


I could try to find all the method invocations that currently use the implicit default charset, although I have no idea how to do this other than reading every 
line of code. The problems with this are 1) that I would almost certainly miss some invocations that need to be changed and 2) more seriously, from what I have 
seen in the JEP I don't think there is a way to update these method invocations that works exactly as at present on all versions of Java back to JDK 8 and 
provides the same behaviour on JDK 18. This is because (as far as I can tell) there is no API call that returns the "old-style" platform default charset and can 
be used on all JDK versions from JDK 8 to JDK 18. Adding a -D option when the application is started isn't possible in some contexts such as launching the 
application from a Windows executable jar file association.


If I could make a single API call when the application is first started to force backward-compatible behaviour in all cases, this would solve the problem. This 
feels very much like a "hack" and I would much prefer a clean solution but it would be better than nothing.


Does this JEP provide some way to do what I need?

Simon