The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#include <internal/utf8.h>
namespace tvision
{
size_t utf16To8(TSpan<const uint16_t> input, char *output) noexcept
{
size_t j = 0;
for (size_t i = 0; i < input.size(); ++i)
{
uint16_t lead = input[i];
uint16_t trail = 0;
if (i + 1 < input.size())
{
uint16_t next = input[i + 1];
if ( 0xD800 <= lead && lead <= 0xDBFF &&
0xDC00 <= next && next <= 0xDFFF )
{
// Surrogate pairs.
trail = next;
++i;
}
}
uint16_t u16[2] {lead, trail};
j += utf16To8(u16, &output[j]);
}
return j;
}
} // namespace tvision