Sherman can answer this best. The 8008386 fix for 8 differs from earlier
updates since alot of the code was rewritten in this area. The initial
report was identified as a regression in JDK6. Back in 2005, the 6227339
fix changed behaviour which meant that invalid single byte characters
were treated incorrectly when decoding Shift_JIS encoded bytes. It meant
that two bytes are decoded to a "?" character rather than one. The valid
single byte characters are lost as a result and I believe this was all
unintended when the 6227339 fix was made.
Changes made in 8008386 mean that the case of a malformed character
(legal leading byte) followed by a valid single byte should now return a
replacement character for the first malformed byte and a correctly
decoded single byte character.
regards,
Sean.
On 22/11/2013 13:20, Alan Bateman wrote:
On 22/11/2013 11:02, Charles Oliver Nutter wrote:
Apologies if this is not the correct place to post this, bit i18n
seemed more focused on languages and localization than the mechanics
of transcoding.
I have noticed a behavioral difference in JDK8 decoding a two-byte
Shift-JIS sequence. Specifically, JDK8 appears to report malformed
input for what should be a valid Shift-JIS sequence, where JDK7
reported that the character was unmappable.
I assume this is related to JDK-8008386 [1] and I'm sure Sherman or
Sean will jump in to explain this (which seems to be related to a long
standing regression).
-Alan
[1] https://bugs.openjdk.java.net/browse/JDK-8008386
Apologies if this is not the correct place to post this, bit i18n
seemed more focused on languages and localization than the mechanics
of transcoding.
I have noticed a behavioral difference in JDK8 decoding a two-byte
Shift-JIS sequence. Specifically, JDK8 appears to report malformed
input for what should be a valid Shift-JIS sequence, where JDK7
reported that the character was unmappable.
The code to reproduce is fairly simple:
byte[] bytes = {(byte)0xEF, 0x40};
CharsetDecoder decoder = Charset.forName("Shift-JIS").newDecoder();
System.out.println(decoder.decode(ByteBuffer.wrap(bytes),
CharBuffer.allocate(2), false));
Note that this is pumping the decoder directly and specifying partial
input (false). We use this mechanism in JRuby for transcoding
arbitrary byte[] from one encoding to another.
The result of running this on JDK7 is "UNMAPPABLE[2]" while the result
on JDK8 is "MALFORMED[1]".
Information online is spotty as to whether this sequence is valid. It
does appear on the table for [JIS X
203](http://x0213.org/codetable/sjis-0213-2004-std.txt) and several
articles on Shift-JIS claim that it is at worst undefined and at best
valid. So I'm leaning toward this being a bug in JDK8's Shift-JIS
decoder.
Note that on JDK7 it is "unmappable", which may mean this code
represents a character with no equivalent in Unicode.
I have uploaded my code to github here:
https://github.com/headius/jdk8_utf8_decoding_bug
Thoughts?
- Charlie