はてなキーワード: UTF-32とは
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b]
https://b.hatena.ne.jp/entry/s/qiita.com/yumetodo/items/54e1a8230dbf513ea85b]
https://togetter.com/li/1301253]
https://naruse.hateblo.jp/entry/2018/12/24/013446]
文字コードを多少かじった人間としては、また人類が文字コードで混乱している。と思っていて議論が深まるのかなと思ったりします。
ただ、この話、見ててもやもやする所が一つありまして、UTF-8の1コードポイント=uint8_t=unsigned charでええんかいな。という点です。
文字コードを少しでも知っている人はUTF-8は1つのコードポイントを可変長のバイト列で表します。
よく言われるようにASCIIは1バイト、大体のCJKV文字は3バイト以上で表します((久々にWikipediaのUTF-8見たら、UTF-8にサロゲートペアってあるんだねー。罪深いわOrale〜))。最大6バイトで1つのコードポイントを表します。
つまりですね、char16_tとかchar32_tとかがUTF-16やUTF-32にマッピングされるのは分かるんですよ。サロゲートペアは脇に置いておいて、コードポイントを表すのにはこの型(っつーか、データ長)を使うよってのが分かるので。
サロゲートペアを考えたときのUTF16も同じ考え方になるんですけど、UTF-8みたいな可変長のバイト長を取るエンコード方式は、結局、1「文字」を表す型(データ長)が定まらないんですよ。
char8_tをunsigned charの子クラスにしたとしてもそれって、UTF-8にとっては「1文字を表す型」ではないんですよ。「1文字を表すバイト列の単位の1つ」でしかないんですよ。(サロゲートペアを考慮したときのchar16_tも同様)。
意味論で言っちゃえばUTF-32に対してchar8_tを使っても意味は同じになるんですよ。UTF-32って8ビット×4で構成されるだけなんで。
なので、UTF-8で表される1文字を型で使いたかったらuint64_tの子クラス(本当は最大6バイトなので48でいいんだけど)にしなきゃダメなんじゃねぇの?もしくは最少8ビットで48ビットを保証する型。とC++界隈ではない自分は思うわけです。