3789983e89
Reviewed-by: darcy, ihse
122 lines
3.9 KiB
Java
122 lines
3.9 KiB
Java
/*
|
|
* Copyright (c) 2008, 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 4896454
|
|
@summary Check GB18030 surrogate encoding/decoding handling
|
|
*/
|
|
|
|
import java.nio.*;
|
|
import java.nio.charset.*;
|
|
|
|
public class SurrogateGB18030Test {
|
|
public static void main(String[] args) throws Exception {
|
|
SurrogateGB18030Test test = new SurrogateGB18030Test();
|
|
|
|
test.roundtripTest();
|
|
|
|
/**
|
|
* Valid Surrogate pair and 4 byte GB18030 representation
|
|
*/
|
|
|
|
String inputString = "\uD800\uDC00";
|
|
|
|
byte[] expectedBytes = { (byte)0x90,
|
|
(byte)0x30,
|
|
(byte)0x81,
|
|
(byte)0x30
|
|
};
|
|
test.encodeTest(inputString, expectedBytes);
|
|
|
|
/**
|
|
* Vice-versa : check that 4 byte GB18030 value encodes correctly
|
|
*/
|
|
|
|
String expectedStr = "\uDBFF\uDFFF";
|
|
|
|
byte[] inputBytes = { (byte)0xe3,
|
|
(byte)0x32,
|
|
(byte)0x9a,
|
|
(byte)0x35
|
|
};
|
|
|
|
|
|
test.decodeTest(inputBytes, expectedStr);
|
|
|
|
}
|
|
|
|
private void roundtripTest() throws Exception
|
|
{
|
|
byte[] ba;
|
|
char[] pair = new char[2];
|
|
for (char high = '\ud800'; high <= '\udbff'; high++) {
|
|
for (char low = '\udc00'; low <= '\udfff'; low++) {
|
|
pair[0] = high;
|
|
pair[1] = low;
|
|
String s = new String(pair);
|
|
if (!s.equals(new String(s.getBytes("gb18030"), "gb18030")))
|
|
throw new Exception ("GB18030 roundtrip failure");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private void encodeTest(String inputString, byte[] expectedBytes)
|
|
throws Exception
|
|
{
|
|
byte[] encoded = inputString.getBytes("GB18030");
|
|
|
|
CharBuffer cb = CharBuffer.wrap(inputString.toCharArray());
|
|
ByteBuffer bb = ByteBuffer.allocate(4);
|
|
|
|
CharsetEncoder encoder = Charset.forName("GB18030").newEncoder();
|
|
encoder.encode(cb, bb, true);
|
|
|
|
bb.flip();
|
|
for (int i = 0 ; i < expectedBytes.length; i++) {
|
|
if (encoded[i] != expectedBytes[i]
|
|
|| bb.get() != expectedBytes[i])
|
|
throw new Exception ("GB18030 encode failure");
|
|
}
|
|
}
|
|
|
|
private void decodeTest(byte[] inputBytes, String expectedStr)
|
|
throws Exception
|
|
{
|
|
String s2 = new String(inputBytes, "GB18030");
|
|
|
|
CharsetDecoder decoder = Charset.forName("GB18030").newDecoder();
|
|
|
|
ByteBuffer bb = ByteBuffer.wrap(inputBytes);
|
|
CharBuffer cb = CharBuffer.allocate(2);
|
|
decoder.decode(bb, cb, true);
|
|
|
|
cb.flip();
|
|
for (int i = 0 ; i < expectedStr.length(); i++) {
|
|
if (expectedStr.charAt(i) != cb.get()
|
|
|| s2.charAt(i) != expectedStr.charAt(i))
|
|
throw new Exception ("GB18030 encode failure");
|
|
}
|
|
}
|
|
}
|