C++11から導入されたchar16_t型は、<uchar>で__STDC_UTF_16__マクロが定義されている場合にUTF-16のコードポイントを保持する文字型になります。ただし、C++20からは__STDC_UTF_16__の定義状態にかかわらずUTF-16になりました。現実問題として、C++11からC++17でもUTF-16だと仮定してしまっても実用上は問題ないと考えられます。

今回はC++11以降を前提に、char16_t型がUTF-16を表すと仮定して各種関数を定義していきたいと思います。また、話を簡単にするために、今回はint型が32ビットであると仮定することにします。

最初に下準備として、必要な定数を定義します。

以下、この定数を使って関数を実装していきます。

UTF-16の符号単位が上位サロゲートか否かを判定する。

UTF-16の符号単位が下位サロゲートか否かを判定する。

UTF-16の符号単位が上位または下位サロゲートか否かを判定する。

UTF-16の2つの符号単位の組 (first,second) がサロゲート・ペアか否かを判定する。


元ネタ

↑ 7. 文字・文字列・文字コードに関する関数・テンプレート