diff --git a/src/share/classes/javax/swing/text/html/parser/Parser.java b/src/share/classes/javax/swing/text/html/parser/Parser.java index eeb832982e273bcf47bd9724cc67226104b04ac6..bd0cebc737340e464a33a525b640bc39858d48e4 100644 --- a/src/share/classes/javax/swing/text/html/parser/Parser.java +++ b/src/share/classes/javax/swing/text/html/parser/Parser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, 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 @@ -952,7 +952,7 @@ class Parser implements DTDConstants { ch = readCh(); break; } - char data[] = {mapNumericReference((char) n)}; + char data[] = mapNumericReference(n); return data; } addString('#'); @@ -1021,7 +1021,7 @@ class Parser implements DTDConstants { } /** - * Converts numeric character reference to Unicode character. + * Converts numeric character reference to char array. * * Normally the code in a reference should be always converted * to the Unicode character with the same code, but due to @@ -1030,13 +1030,21 @@ class Parser implements DTDConstants { * to displayable characters with other codes. * * @param c the code of numeric character reference. - * @return the character corresponding to the reference code. + * @return a char array corresponding to the reference code. */ - private char mapNumericReference(char c) { - if (c < 130 || c > 159) { - return c; + private char[] mapNumericReference(int c) { + char[] data; + if (c >= 0xffff) { // outside unicode BMP. + try { + data = Character.toChars(c); + } catch (IllegalArgumentException e) { + data = new char[0]; + } + } else { + data = new char[1]; + data[0] = (c < 130 || c > 159) ? (char) c : cp1252Map[c - 130]; } - return cp1252Map[c - 130]; + return data; } /** diff --git a/test/javax/swing/text/html/parser/Parser/6836089/bug6836089.java b/test/javax/swing/text/html/parser/Parser/6836089/bug6836089.java new file mode 100644 index 0000000000000000000000000000000000000000..cf41b8c88fa918fefa3ebc899d808c8595ceaf83 --- /dev/null +++ b/test/javax/swing/text/html/parser/Parser/6836089/bug6836089.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2010, 2012, 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 6836089 + * @summary Tests correct parsing of characters outside Base Multilingual Plane + * @author Vladislav Karnaukhov + */ + +import javax.swing.*; +import javax.swing.text.html.*; + +public class bug6836089 { + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + JTextPane htmlPane = new JTextPane(); + htmlPane.setEditorKit(new HTMLEditorKit()); + + htmlPane.setText("𠀀"); + String str = htmlPane.getText(); + if (str.contains("�")) { + throw new RuntimeException("Test failed"); + } + } + }); + } +}