pub enum WstringCodeUnits {
Utf16,
Utf8,
}Expand description
Which octets stand for a wstring’s characters.
XTypes 1.3 Table 31 gives Char16 for a wstring’s code unit and
§7.4.1.1.2 fixes the two things that follow from it: the length is
“twice the number of characters in the string”, and the
representation “shall not include a terminating NUL character(s)”.
WstringLengthPolicy answers how the length is counted and
whether there is a terminator; this answers what the characters
are, and the two are separate because they part.
§The measurement
tests/interop-results/wstring-member/hdds/plain-cdr1.le.bin is
04 00 00 00 61 62 63 00 for @appendable struct S { wstring w; }
with w = "abc": three octets of UTF-8 and a NUL, with the NUL
inside the four the length declares — which is exactly what
§7.4.1.1.1 gives a narrow string, and nothing §7.4.1.1.2 admits
for a wstring.
wstring-unbounded-utf8 is the row that pins the encoding rather
than the length. "äöü ሴ Z" is seven characters; UTF-8 puts them
in twelve octets and the recorded file declares
0d 00 00 00 — thirteen, the twelve and the NUL — where
§7.4.1.1.2’s rule and Table 31 give fourteen. The next four octets
are c3 a4 c3 b6 c3 bc 20 e1 88 b4 20 5a 00, the twelve in UTF-8
and the terminator.
§What it does not reach
The scalar wchar is WcharWidth’s and not this: a peer whose
wstring is UTF-8 can still write a four-octet scalar wchar, and
one that writes a UTF-8 wstring does not thereby say what a
wchar is. rmw_cyclonedds_cpp already parts the two that way.
And it makes WstringLengthPolicy’s C1 and C3 vacuous: with no
fixed-width code unit there is nothing for a character count to
count and no width for an octet count to multiply by, so the writer
declares the UTF-8 octet count and only C2 — the terminator — still
reaches the wire.
Variants§
Utf16
XTypes 1.3 Table 31’s Char16, two octets per code unit, and
WstringLengthPolicy decides the rest. The default.
Utf8
The characters’ own UTF-8 octets, one to four per code point,
with WstringTerminator’s answer still reached.
Implementations§
Source§impl WstringCodeUnits
impl WstringCodeUnits
Sourcepub const fn is_default(self) -> bool
pub const fn is_default(self) -> bool
Whether this is the default.
Sourcepub const fn counts_octets(self) -> bool
pub const fn counts_octets(self) -> bool
Whether the length prefix counts octets rather than code units,
whichever of the two answers WstringLengthCounts gives.
Under Self::Utf8 there is no code unit to count and no width
to multiply an octet count by, so the octets are what the length
names whatever C1 says. One predicate, so a reader of the writer
cannot mistake one for the other.