UTF-16のサロゲートとUnicodeスカラ値(UTF-32)の相互変換を行います。今回も前回と同様、C++11以降かつint型が32ビットの処理系を仮定しています。
定数定義は前回のものを引き継ぎますが、以下のものを追加する必要があります。
0 1 2 3 |
// 補助面の最初の符号位置 (1面の最初の符号位置) constexpr int unicode_plane1_min = 0x010000; |
これを踏まえて実際の関数を定義していくことにします。
サロゲート・ペアを解読 (Unicodeスカラ値に変換) する。
0 1 2 3 4 5 |
constexpr char32_t decode_surrogate_pair(char16_t high, char16_t low) { return ((high & high_surrogate_mask) << surrogate_bits) + (low & low_surrogate_mask) + unicode_plane1_min; } |
Unicodeスカラ値(1~16面)を上位サロゲートに変換する。
0 1 2 3 4 5 |
constexpr char16_t unicode_to_high_surrogate(char32_t c) { return ((c - unicode_plane1_min) >> surrogate_bits) & high_surrogate_mask | high_surrogate_min; } |
Unicodeスカラ値(1~16面)を下位サロゲートに変換する。
0 1 2 3 4 5 |
constexpr char16_t unicode_to_low_surrogate(char32_t c) { return c & low_surrogate_mask | low_surrogate_min; } |