Dart API Referencedart:utfUtf16BytesToCodeUnitsDecoder

Utf16BytesToCodeUnitsDecoder class

Convert UTF-16 encoded bytes to UTF-16 code units by grouping 1-2 bytes to produce the code unit (0-(2^16)-1). Relies on BOM to determine endian-ness, and defaults to BE.

class Utf16BytesToCodeUnitsDecoder implements _ListRangeIterator {
  final _ListRangeIterator utf16EncodedBytesIterator;
  final int replacementCodepoint;

  Utf16BytesToCodeUnitsDecoder._fromListRangeIterator(
      this.utf16EncodedBytesIterator, this.replacementCodepoint);

  factory Utf16BytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
      int offset = 0, int length,
      int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
    if (length == null) {
      length = utf16EncodedBytes.length - offset;
    }
    if (hasUtf16beBom(utf16EncodedBytes, offset, length)) {
      return new Utf16beBytesToCodeUnitsDecoder(utf16EncodedBytes, offset + 2,
          length - 2, false, replacementCodepoint);
    } else if (hasUtf16leBom(utf16EncodedBytes, offset, length)) {
      return new Utf16leBytesToCodeUnitsDecoder(utf16EncodedBytes, offset + 2,
          length - 2, false, replacementCodepoint);
    } else {
      return new Utf16beBytesToCodeUnitsDecoder(utf16EncodedBytes, offset,
          length, false, replacementCodepoint);
    }
  }

  /**
   * Provides a fast way to decode the rest of the source bytes in a single
   * call. This method trades memory for improved speed in that it potentially
   * over-allocates the List containing results.
   */
  List<int> decodeRest() {
    List<int> codeunits = new List<int>(remaining);
    int i = 0;
    while (hasNext()) {
      codeunits[i++] = next();
    }
    if (i == codeunits.length) {
      return codeunits;
    } else {
      List<int> truncCodeunits = new List<int>(i);
      truncCodeunits.setRange(0, i, codeunits);
      return truncCodeunits;
    }
  }

  bool hasNext() => utf16EncodedBytesIterator.hasNext();

  int next() {
    if (utf16EncodedBytesIterator.remaining < 2) {
      utf16EncodedBytesIterator.next();
      if (replacementCodepoint != null) {
        return replacementCodepoint;
      } else {
        throw new ArgumentError(
            "Invalid UTF16 at ${utf16EncodedBytesIterator.position}");
      }
    } else {
      return decode();
    }
  }

  int get position => utf16EncodedBytesIterator.position ~/ 2;

  void backup([int by = 1]) {
    utf16EncodedBytesIterator.backup(2 * by);
  }

  int get remaining => (utf16EncodedBytesIterator.remaining + 1) ~/ 2;

  void skip([int count = 1]) {
    utf16EncodedBytesIterator.skip(2 * count);
  }

  abstract int decode();
}

Subclasses

Utf16beBytesToCodeUnitsDecoder, Utf16leBytesToCodeUnitsDecoder

Constructors

factory Utf16BytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [int offset = 0, int length, int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) #

factory Utf16BytesToCodeUnitsDecoder(List<int> utf16EncodedBytes, [
    int offset = 0, int length,
    int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
  if (length == null) {
    length = utf16EncodedBytes.length - offset;
  }
  if (hasUtf16beBom(utf16EncodedBytes, offset, length)) {
    return new Utf16beBytesToCodeUnitsDecoder(utf16EncodedBytes, offset + 2,
        length - 2, false, replacementCodepoint);
  } else if (hasUtf16leBom(utf16EncodedBytes, offset, length)) {
    return new Utf16leBytesToCodeUnitsDecoder(utf16EncodedBytes, offset + 2,
        length - 2, false, replacementCodepoint);
  } else {
    return new Utf16beBytesToCodeUnitsDecoder(utf16EncodedBytes, offset,
        length, false, replacementCodepoint);
  }
}

Properties

final int position #

int get position => utf16EncodedBytesIterator.position ~/ 2;

final int remaining #

int get remaining => (utf16EncodedBytesIterator.remaining + 1) ~/ 2;

final int replacementCodepoint #

final int replacementCodepoint;

final _ListRangeIterator utf16EncodedBytesIterator #

final _ListRangeIterator utf16EncodedBytesIterator;

Methods

void backup([int by = 1]) #

void backup([int by = 1]) {
  utf16EncodedBytesIterator.backup(2 * by);
}

abstract int decode() #

List<int> decodeRest() #

Provides a fast way to decode the rest of the source bytes in a single call. This method trades memory for improved speed in that it potentially over-allocates the List containing results.

List<int> decodeRest() {
  List<int> codeunits = new List<int>(remaining);
  int i = 0;
  while (hasNext()) {
    codeunits[i++] = next();
  }
  if (i == codeunits.length) {
    return codeunits;
  } else {
    List<int> truncCodeunits = new List<int>(i);
    truncCodeunits.setRange(0, i, codeunits);
    return truncCodeunits;
  }
}

bool hasNext() #

Returns whether the Iterator has elements left.

docs inherited from Iterator<E>
bool hasNext() => utf16EncodedBytesIterator.hasNext();

int next() #

Gets the next element in the iteration. Throws a NoMoreElementsException if no element is left.

docs inherited from Iterator<E>
int next() {
  if (utf16EncodedBytesIterator.remaining < 2) {
    utf16EncodedBytesIterator.next();
    if (replacementCodepoint != null) {
      return replacementCodepoint;
    } else {
      throw new ArgumentError(
          "Invalid UTF16 at ${utf16EncodedBytesIterator.position}");
    }
  } else {
    return decode();
  }
}

void skip([int count = 1]) #

void skip([int count = 1]) {
  utf16EncodedBytesIterator.skip(2 * count);
}