FYI, WG14 N2761 proposes extending the printf() format syntax to allow passing char16_t and char32_t strings. From the abstract:
The formatting family of functions (printf, scanf, etc; hereafter referred to as "format functions") have
supported the l type modifier for the c and s format specifiers for a while, the point of the l modifier is to
add support for "wide" characters/strings.
The concept of "wide" characters/strings comes from Unicode's history, back in the late 80s/early 90s
when it was thought that Unicode could be contained within 65535 characters, which has not been true
since the advent of the UTF-16 and UTF-32 encoding forms, which were presented as part of Unicode
2.0 in July 1996.
On the internet, according to Web Technology Surveys, Unicode and it's derivatives/ancestors (ISO-
8859-1, ASCII, Windows-1252) make up 98.0% of webpages, as of December 2020.
Combine that fact, with the fact that the only 16 and 32 bit character sets I can find in my research are
UTF-16, UCS-2, UTF-32, and UCS-4; All Unicode encodings. UCS-4 is an alias for UTF-32, and UCS-2 is
an ancestor encoding that UTF-16 superseded by adding Surrogate Pairs, and Surrogate Pairs are
encoded in such a way that it can't affect the de/en coding of char16_t codepoints by any Unicode
compatible codec from the last quarter century, and it becomes clear that in use, char16_t and char32_t
can ONLY contain Unicode.
The C standard it's self, as of C11 introduces typedefs for these characters in uchar.h, char16_t and
But there is still problems today with wide characters and strings and Unicode character and string types.
Take this simple program for example  This simple program produces no output on my computer,
compiled with Clang 11 on MacOS or Windows.
In short, wide characters and strings are a broken and obsolete feature.
But, I'm not here to wrestle with the committee about removing or even deprecating wide characters/string
support from the standard library.
Instead, I'm here to propose a more sane solution to this mess: Add two length modifiers to format
specifiers, l16 and l32 for c and s specifier types for UTF-16 and UTF-32 support respectively.
So format specifiers would look like %l16c, %l16s, %l32c, %l32s
I've implemented support for the 16 and 32 extension to the l (ell) length modifier in Clang already.