UTF-8のMB_CUR_MAXが4ではなく6であるのはなぜですか? (Linux、glibc)

UTF-8のMB_CUR_MAXが4ではなく6であるのはなぜですか? (Linux、glibc)

MB_CUR_MAXglibc は、「現在のロケールにおけるマルチバイト文字の最大バイト数を表す正の整数表現」として定義されます。

私が得た値を印刷すると1C私のシステムのロケールが.であるにもかかわらず、Cがデフォルトでロケールを使用するためだと思いますen_US.UTF-8

これを私のプログラムに追加すると、setlocale(LC_ALL, "")環境のロケール使用が有効にMB_CUR_MAXなります6

今私の質問はなぜ6ですか? UTF-8にはコードポイントあたり1〜4バイトのエンコーディングはありませんか?

答え1

~によるとウィキペディア、UTF-8は、RFC 3629にいくつかの制限が追加された2003年までに最大6バイトを必要としました。

UTF-8は、1993年1月25日から29日までサンディエゴで開催されたUSENIXカンファレンスで最初に正式に提案されました。インターネットエンジニアリングタスクフォースは、RFC 2277(BCP 18)文字セットおよび言語ポリシーで、将来のインターネットのためのUTF-8規格の採用に取り組んでいます。

[上記の表は「UTF-8(1993)」と表示されており、U + 4000000からU + 7FFFFFFFFまでのコードポイントに6バイトが必要であることを示しています。

2003年11月、UTF-8は、UTF-16文字エンコーディングの制約と一致するようにRFC 3629によって制限されました。つまり、上位および下位の代理文字に対応するコードポイントは、3バイトシーケンスの3%以上を削除して次に終了することを明示的に禁止されています。 U+10FFFF4バイトのシーケンスの48%以上と5バイトと6バイトのシーケンスがすべて削除されました。

関連情報