out.order(originalBO);
  protected CoderResult encodeLoop (CharBuffer in, ByteBuffer out)  {    // TODO: Optimize this in the case in.hasArray() / out.hasArray()    if (needsByteOrderMark)      {        if (out.remaining () < 2)          return CoderResult.OVERFLOW;        put (out, BYTE_ORDER_MARK);        needsByteOrderMark = false;      }    int inPos = in.position ();    try      {        while (in.hasRemaining ())          {            char c = in.get ();            if (0xD800 <= c && c <= 0xDFFF)              {                // c is a surrogate                // make sure c is a high surrogate                if (c > 0xDBFF)                  return CoderResult.malformedForLength (1);                if (in.remaining () < 1)                  return CoderResult.UNDERFLOW;                char d = in.get ();                // make sure d is a low surrogate                if (d < 0xDC00 || d > 0xDFFF)                  return CoderResult.malformedForLength (1);                put (out, c);                put (out, d);                inPos += 2;              }            else              {                if (out.remaining () < 2)                  return CoderResult.OVERFLOW;                put (out, c);                inPos++;              }          }        return CoderResult.UNDERFLOW;      }    finally      {        in.position (inPos);      }  }