Utf16View
Description
A Utf16View provides a bidirectional view over the unicode component as a collection of UTF-16 code units in platform-endian format.
UTF-16 is a 16-bit variable-length encoding that encodes unicode scalar values with one or two 16-bit code units. Unicode scalar values < 2^16 can be encoded in one 16-bit code unit, while everything above 2^16 will require two 16-bit code units. This pair of code units is called a surrogate pair with a leading surrogate and a trailing
surrogate.
• #next/#previous - Answers a 16-bit <Integer>.
• #contents - Answers a <Utf16>
Examples
| view |
view := Utf16View on: 'abc'.
self assert: [view next = $a value].
self assert: [view next = $b value].
self assert: [view next = $c value].
self assert: [view atEnd].
self assert: [view previous = $c value].
self assert: [view previous = $b value].
self assert: [view previous = $a value].
self assert: [view atStart].
self assert: [view contents asArray = { $a value. $b value. $c value}]
Instance State
• trailingSurrogate: <Integer | UndefinedObject> vm managed decoder state. Will be notNil if cursored on a surrogate pair.
• startAtTrailingSurrogate: <Boolean> vm managed. True if the view's first element is the trailing surrogate of a surrogate pair.
• stopAfterLeadingSurrogate: <Boolean> vm managed. True if the view's last element is the leading surrogate of a surrogate pair.
Class Methods
None
Instance Methods
atEnd
Answer a Boolean which is true if the receiver cannot
access any more objects, and false otherwise.
Notes:
Override is required since utf16 views can end on a leading surrogate in a
surrogate pair. Therefore, the view surrogate related state must be considered
before it can be determined that the utf16 view is positioned at the end.
Example:
| view sliceView |
'EARTH GLOBE EUROPE-AFRICA'.
view := #[240 159 140 141] utf16.
self assert: [view contents = (Utf16 with: 55356 with: 57101)].
sliceView := view copyFrom: 1 to: 1.
self assert: [sliceView contents = (Utf16 with: 55356)].
self assert: [sliceView atEnd not].
self assert: [sliceView next = 55356].
self assert: [sliceView atEnd].
sliceView := view copyFrom: 2.
self assert: [sliceView contents = (Utf16 with: 57101)].
self assert: [sliceView atEnd not].
self assert: [sliceView next = 57101].
self assert: [sliceView atEnd]
Answers:
<Boolean>
atStart
Answer a Boolean which is true if the receiver cannot
access any more objects, and false otherwise.
Notes:
Override is required since utf16 views can start on a trailing surrogate in a
surrogate pair. Therefore, the view surrogate related state must be considered
before it can be determined that the utf16 view is positioned at the start.
Example:
| view sliceView |
'EARTH GLOBE EUROPE-AFRICA'.
view := #[240 159 140 141] utf16.
self assert: [view contents = (Utf16 with: 55356 with: 57101)].
sliceView := view copyFrom: 1 to: 1.
self assert: [sliceView contents = (Utf16 with: 55356)].
sliceView setToEnd.
self assert: [sliceView atStart not].
self assert: [sliceView previous = 55356].
self assert: [sliceView atStart].
sliceView := view copyFrom: 2.
self assert: [sliceView contents = (Utf16 with: 57101)].
sliceView setToEnd.
self assert: [sliceView atStart not].
self assert: [sliceView previous = 57101].
self assert: [sliceView atStart]
Answers:
<Boolean>
Last modified date: 04/20/2022