codepointsToUtf16CodeUnits function
Encode code points as UTF16 code units.
Implementation
List<int> codepointsToUtf16CodeUnits(List<int> codepoints,
[int offset = 0,
int? length,
int? replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
var listRange = ListRange(codepoints, offset, length);
//var encodedLength = 0;
for (var value in listRange) {
if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
(value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
//encodedLength++;
} else if (value > UNICODE_PLANE_ONE_MAX &&
value <= UNICODE_VALID_RANGE_MAX) {
//encodedLength += 2;
} else {
//encodedLength++;
}
}
var codeUnitsBuffer = <int>[];
for (var value in listRange) {
if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
(value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
codeUnitsBuffer.add(value);
} else if (value > UNICODE_PLANE_ONE_MAX &&
value <= UNICODE_VALID_RANGE_MAX) {
var base = value - UNICODE_UTF16_OFFSET;
codeUnitsBuffer.add(UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
((base & UNICODE_UTF16_HI_MASK) >> 10));
codeUnitsBuffer.add(
UNICODE_UTF16_SURROGATE_UNIT_1_BASE + (base & UNICODE_UTF16_LO_MASK));
} else if (replacementCodepoint != null) {
codeUnitsBuffer.add(replacementCodepoint);
} else {
throw ArgumentError('Invalid encoding');
}
}
return codeUnitsBuffer;
}