Uploaded image for project: 'Harmony'
  1. Harmony
  2. HARMONY-173

java.nio.charset.CharsetEncoder.encode method does not reserve remaining bytes for next invocation.

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • None
    • Classlib
    • None

    Description

      Method
      public final CoderResult encode(CharBuffer in,
      ByteBuffer out,
      boolean endOfInput)
      Considering that there is a supplemental character which represents by 4 bytes like "\ud800\udc00", and it was divided into two input buffers. e.g. "\ud800" is at the end of input1 and the "\udc00" is at the begining of input2. when invoking the method encode(input1,out,false), it deals with "\ud800" as a malformed charactor and I think it should be reversed for next invocation like encode(input2,out,true).

      And it aslo must be handled correspondingly in method public final ByteBuffer encode(CharBuffer in).

      ===Test segment to reproduce the bug (fail on RI 5.0 and Harmony. I think it's also a bug for RI 5.0)

      CharsetEncoder encoder = Charset.forName("utf-8").newEncoder();
      CharBuffer in1 = CharBuffer.wrap("\ud800");
      CharBuffer in2 = CharBuffer.wrap("\udc00");
      ByteBuffer out = ByteBuffer.allocate(4);
      encoder.reset();
      CoderResult result = encoder.encode(in1, out, false);
      assertEquals(4, out.remaining());
      assertTrue(result.isUnderflow());
      result = encoder.encode(in2, out, true);
      assertEquals(0, out.remaining());
      assertTrue(result.isUnderflow());

      Attachments

        1. CharsetEncoder_patch_173.txt
          10 kB
          Paulex Yang
        2. CharsetEncoderTest_patch_173.txt
          1 kB
          Paulex Yang

        Activity

          People

            tellison Tim Ellison
            richard_liang Richard Liang
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: