# HG changeset patch # User itakiguchi # Date 1541108890 14400 # Node ID fb71a4bc010d7367ac8014b04c160379634d3e0c # Parent 907fdbbdf584aec963a412eeb011a028bc4a075b 8211382: ISO2022JP and GB18030 NIO converter issues Reviewed-by: sherman, rriggs diff -r 907fdbbdf584 -r fb71a4bc010d src/jdk.charsets/share/classes/sun/nio/cs/ext/GB18030.java.template --- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/GB18030.java.template Thu Nov 01 14:32:55 2018 -0700 +++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/GB18030.java.template Thu Nov 01 17:48:10 2018 -0400 @@ -12519,7 +12519,7 @@ dst.put(getChar(offset)); else if (offset >= 0x830D && offset <= 0x93A8) dst.put((char)(offset + 0x6557)); - else if (offset >= 0x93A9 && offset <= 0x99F9) + else if (offset >= 0x93A9 && offset <= 0x99FB) dst.put(getChar(offset)); // Supplemental UCS planes handled via surrogates else if (offset >= 0x2E248 && offset < 0x12E248) { diff -r 907fdbbdf584 -r fb71a4bc010d src/jdk.charsets/share/classes/sun/nio/cs/ext/ISO2022_JP.java --- a/src/jdk.charsets/share/classes/sun/nio/cs/ext/ISO2022_JP.java Thu Nov 01 14:32:55 2018 -0700 +++ b/src/jdk.charsets/share/classes/sun/nio/cs/ext/ISO2022_JP.java Thu Nov 01 17:48:10 2018 -0400 @@ -312,7 +312,7 @@ break; case JISX0201_1976_KANA: case SHIFTOUT: - if (b1 > 0x60) { + if (b1 > 0x5f) { return CoderResult.malformedForLength(inputSize); } da[dp++] = (char)(b1 + 0xff40); @@ -433,7 +433,7 @@ break; case JISX0201_1976_KANA: case SHIFTOUT: - if (b1 > 0x60) { + if (b1 > 0x5f) { return CoderResult.malformedForLength(inputSize); } dst.put((char)(b1 + 0xff40)); diff -r 907fdbbdf584 -r fb71a4bc010d test/jdk/sun/nio/cs/TestGB18030.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/sun/nio/cs/TestGB18030.java Thu Nov 01 17:48:10 2018 -0400 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8211382 + * @summary Check GB18030 + * @modules jdk.charsets + */ + +import java.io.*; +import java.nio.*; +import java.nio.charset.*; + +public class TestGB18030 { + public static void gb18030_1(boolean useDirect) throws Exception { + for(char ch : new char[]{'\uFFFE', '\uFFFF'}) { + char[] ca = new char[]{ch}; + Charset cs = Charset.forName("GB18030"); + CharsetEncoder ce = cs.newEncoder(); + CharsetDecoder cd = cs.newDecoder(); + CharBuffer cb = CharBuffer.wrap(ca); + ByteBuffer bb; + if (useDirect) { + bb = ByteBuffer.allocateDirect( + (int)Math.ceil(ce.maxBytesPerChar())); + } else { + bb = ByteBuffer.allocate( + (int)Math.ceil(ce.maxBytesPerChar())); + } + CoderResult cr = ce.encode(cb, bb, true); + if (!cr.isUnderflow()) { + throw new RuntimeException( + String.format("Encoder Error: \\u%04X: direct=%b: %s", + (int)ch, + useDirect, + cr.toString())); + } + bb.position(0); + cb = CharBuffer.allocate((int)Math.ceil( + cd.maxCharsPerByte()*bb.limit())); + cr = cd.decode(bb, cb, true); + if (!cr.isUnderflow()) { + throw new RuntimeException( + String.format("Decoder Error: \\u%04X: direct=%b: %s", + (int)ch, + useDirect, + cr.toString())); + } + if (ca[0] != cb.get(0)) { + throw new RuntimeException( + String.format("direct=%b: \\u%04X <> \\u%04X", + useDirect, + (int)ca[0], + (int)cb.get(0))); + } + } + } + public static void main(String args[]) throws Exception { + gb18030_1(false); + gb18030_1(true); + } +} diff -r 907fdbbdf584 -r fb71a4bc010d test/jdk/sun/nio/cs/TestISO2022JP.java --- a/test/jdk/sun/nio/cs/TestISO2022JP.java Thu Nov 01 14:32:55 2018 -0700 +++ b/test/jdk/sun/nio/cs/TestISO2022JP.java Thu Nov 01 17:48:10 2018 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ */ /* @test - * @bug 4626545 4879522 4913711 4119445 8042125 + * @bug 4626545 4879522 4913711 4119445 8042125 8211382 * @summary Check full coverage encode/decode for ISO-2022-JP * @modules jdk.charsets */ @@ -647,5 +647,17 @@ if (!new String(encoded, "x-windows-iso2022jp").equals(expectedStr)) { throw new Exception("MSISO2022JP Decoder error"); } + // Test for 11 iso2022jp decoder + encoded = new byte[] { + (byte)0x1B, (byte)0x28, (byte)0x49, (byte)0x60, + (byte)0x1B, (byte)0x28, (byte)0x42, + }; + String unexpectedStr = "\uffa0"; + expectedStr = "\ufffd"; + if (new String(encoded, "ISO2022JP").equals(unexpectedStr)) { + throw new Exception("ISO2022JP Decoder error: \\uFFA0"); + } else if (!new String(encoded, "ISO2022JP").equals(expectedStr)) { + throw new Exception("ISO2022JP Decoder error: \\uFFFD"); + } } }