Types

Internally, the Text type is represented as an array of Word16
UTF-16 code units. The offset and length fields in the constructor
are in these units, not units of Char.

Invariants that all functions must maintain:

Since the Text type uses UTF-16 internally, it cannot represent
characters in the reserved surrogate code point range U+D800 to
U+DFFF. To maintain this invariant, the safe function maps
Char values in this range to the replacement character (U+FFFD,
'�').

A leading (or "high") surrogate code unit (0xD800–0xDBFF) must
always be followed by a trailing (or "low") surrogate code unit
(0xDC00-0xDFFF). A trailing surrogate code unit must always be
preceded by a leading surrogate code unit.

Safety

UTF-16 surrogate code points are not included in the set of Unicode
scalar values, but are unfortunately admitted as valid Char
values by Haskell. They cannot be represented in a Text. This
function remaps those code points to the Unicode replacement
character (U+FFFD, '�'), and leaves other code points
unchanged.