# HG changeset patch # Parent ab872688e8b33611fa808229360711deeccfbbc3 (#6877495) JTextField and JTextArea does not support supplementary characters. diff --git a/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java b/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java --- a/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java +++ b/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java @@ -29,12 +29,10 @@ import java.awt.EventQueue; import java.awt.Image; import java.awt.Graphics; -import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.FlavorMap; import java.awt.datatransfer.FlavorTable; -import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; @@ -1786,7 +1784,7 @@ */ public class ReencodingInputStream extends InputStream { protected BufferedReader wrapped; - protected final char[] in = new char[1]; + protected final char[] in = new char[2]; // #6877495 protected byte[] out; protected CharsetEncoder encoder; @@ -1839,7 +1837,7 @@ try { encoder = Charset.forName(targetEncoding).newEncoder(); - out = new byte[(int)(encoder.maxBytesPerChar() + 0.5)]; + out = new byte[(int)(encoder.maxBytesPerChar() * 2 + 0.5)]; // #6877495 inBuf = CharBuffer.wrap(in); outBuf = ByteBuffer.wrap(out); } catch (IllegalCharsetNameException e) { @@ -1863,31 +1861,50 @@ } } + private int readChar() throws IOException { + int c = wrapped.read(); + + if (c == -1) { // -1 is EOS + eos = true; + return -1; + } + + // "c == 0" is not quite correct, but good enough on Windows. + if (numTerminators > 0 && c == 0) { + eos = true; + return -1; + } else if (eoln != null && matchCharArray(eoln, c)) { + c = '\n' & 0xFFFF; + } + + return c; + } + public int read() throws IOException { if (eos) { return -1; } if (index >= limit) { - int c = wrapped.read(); - - if (c == -1) { // -1 is EOS - eos = true; + // #6877495 - deal with supplementary characters + int c = readChar(); + if (c == -1) { return -1; } - // "c == 0" is not quite correct, but good enough on Windows. - if (numTerminators > 0 && c == 0) { - eos = true; - return -1; - } else if (eoln != null && matchCharArray(eoln, c)) { - c = '\n' & 0xFFFF; + in[0] = (char) c; + in[1] = 0; + inBuf.limit(1); + if (Character.isHighSurrogate((char) c)) { + c = readChar(); + if (c != -1) { + in[1] = (char) c; + inBuf.limit(2); + } } - in[0] = (char)c; - inBuf.rewind(); - outBuf.rewind(); + outBuf.limit(out.length).rewind(); encoder.encode(inBuf, outBuf, false); outBuf.flip(); limit = outBuf.limit();