MB_CUR_MAX
glibc は、「現在のロケールにおけるマルチバイト文字の最大バイト数を表す正の整数表現」として定義されます。
私が得た値を印刷すると1
。C
私のシステムのロケールが.であるにもかかわらず、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バイトのシーケンスがすべて削除されました。