public ByteBuffer encode(
      final CodePointBuffer text, ByteBuffer buffer, final EncodingErrorType errorHandling)
      throws EncodingException {
    final int textLength = text.getLength();
    if (buffer == null) {
      buffer = new ByteBuffer(textLength);
    } else if (buffer.getLength() < textLength) {
      buffer.ensureSize(textLength);
    }

    final byte[] targetArray = buffer.getData();
    final int[] sourceArray = text.getData();

    int targetIdx = buffer.getOffset();
    final int endPos = text.getCursor();
    for (int i = text.getOffset(); i < endPos; i++) {
      final int sourceItem = sourceArray[i];
      if (isUnicodeCharacterSupported(sourceItem)) {
        targetArray[targetIdx] = (byte) (sourceItem & 0xff);
        targetIdx += 1;
      } else {
        if (EncodingErrorType.REPLACE.equals(errorHandling)) {
          targetArray[targetIdx] = (byte) ('?' & 0xff);
          targetIdx += 1;
        } else if (EncodingErrorType.FAIL.equals(errorHandling)) {
          throw new EncodingException();
        }
      }
    }

    buffer.setCursor(targetIdx);
    return buffer;
  }
  public CodePointBuffer decode(final ByteBuffer text, CodePointBuffer buffer) {
    final int textLength = text.getLength();
    if (buffer == null) {
      buffer = new CodePointBuffer(textLength);
    } else if (buffer.getLength() < textLength) {
      buffer.ensureSize(textLength);
    }

    final int[] targetArray = buffer.getData();
    final byte[] sourceArray = text.getData();

    int targetIdx = buffer.getOffset();
    final int endPos = text.getCursor();
    for (int i = text.getOffset(); i < endPos; i++) {
      targetArray[targetIdx] = (sourceArray[i] & 0xff);
      targetIdx += 1;
    }

    buffer.setCursor(targetIdx);
    return buffer;
  }
  /**
   * Encode, but ignore errors.
   *
   * @param text
   * @param buffer
   * @return
   */
  public ByteBuffer encode(final CodePointBuffer text, ByteBuffer buffer) {
    final int textLength = text.getLength();
    if (buffer == null) {
      buffer = new ByteBuffer(textLength);
    } else if (buffer.getLength() < textLength) {
      buffer.ensureSize(textLength);
    }

    final byte[] targetArray = buffer.getData();
    final int[] sourceArray = text.getData();

    int targetIdx = buffer.getOffset();
    final int endPos = text.getCursor();
    for (int i = text.getOffset(); i < endPos; i++) {
      final int sourceItem = sourceArray[i];
      if (isUnicodeCharacterSupported(sourceItem)) {
        targetArray[targetIdx] = (byte) (sourceItem & 0xff);
        targetIdx += 1;
      }
    }

    buffer.setCursor(targetIdx);
    return buffer;
  }