diff --git a/src/share/classes/sun/nio/cs/ext/GB18030.java b/src/share/classes/sun/nio/cs/ext/GB18030.java index c0dbd29b8e764e56bb16eedd6f3e0a1ad81039a1..ddbd7bc121e79813e61689b0366a24ecea02174e 100644 --- a/src/share/classes/sun/nio/cs/ext/GB18030.java +++ b/src/share/classes/sun/nio/cs/ext/GB18030.java @@ -12518,7 +12518,7 @@ public class GB18030 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 --git a/src/share/classes/sun/nio/cs/ext/ISO2022_JP.java b/src/share/classes/sun/nio/cs/ext/ISO2022_JP.java index 40e9a1a75567acd121ae8442ca36d6063e6ab603..8ef4b5b164dfd2c8f35b100388f35f3f8a09d6b1 100644 --- a/src/share/classes/sun/nio/cs/ext/ISO2022_JP.java +++ b/src/share/classes/sun/nio/cs/ext/ISO2022_JP.java @@ -309,7 +309,7 @@ public class ISO2022_JP break; case JISX0201_1976_KANA: case SHIFTOUT: - if (b1 > 0x60) { + if (b1 > 0x5f) { return CoderResult.malformedForLength(inputSize); } da[dp++] = (char)(b1 + 0xff40); @@ -430,7 +430,7 @@ public class ISO2022_JP break; case JISX0201_1976_KANA: case SHIFTOUT: - if (b1 > 0x60) { + if (b1 > 0x5f) { return CoderResult.malformedForLength(inputSize); } dst.put((char)(b1 + 0xff40)); diff --git a/test/sun/nio/cs/TestGB18030.java b/test/sun/nio/cs/TestGB18030.java new file mode 100644 index 0000000000000000000000000000000000000000..d7183967058a33c2cda5fd6191c1803ac4eb94ae --- /dev/null +++ b/test/sun/nio/cs/TestGB18030.java @@ -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 --git a/test/sun/nio/cs/TestISO2022JP.java b/test/sun/nio/cs/TestISO2022JP.java index 8ea4cb7faf7401bf286045feee1b47d0d067dd28..197a5691f87d0bb3748eefe1f7bb7962a243f9da 100644 --- a/test/sun/nio/cs/TestISO2022JP.java +++ b/test/sun/nio/cs/TestISO2022JP.java @@ -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 + @bug 4626545 4879522 4913711 4119445 8211382 @summary Check full coverage encode/decode for ISO-2022-JP */ @@ -608,5 +608,18 @@ public class TestISO2022JP { if (encoded[i] != expected[i]) throw new Exception("ISO-2022-JP 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"; + String 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"); + } } }