質問: P0482R5: char8_t: A type for UTF-8 characters and strings (Revision 5) がC++20に採択され、めでたくchar8_tが標準入りしたわけですが、このP0482R5によくわからない点があります。 Changes since P0482R4の節に >Updated [depr.locale.category] and [depr.fs.path.factory] with changes suggested by Tim Song to ensure behavior remains unchanged. とあり、なぜか`codecvt`, `codecvt`, `codecvt_byname`, `codecvt_byname`が追加されています。 codecvtはエラーハンドリングがガバのプーさんだから消すねっ!ということでC++17で多くが、残っていた`codecvt`, `codecvt`, `codecvt_byname`, `codecvt_byname`もC++20でdeprecatedになったことで完全にcodecvtは空気になったと認識していたのですが、 これはUnicode間の変換がガバガバなまま復活を遂げたと理解すればいいのでしょうか・・・?
回答: セキュリティ要件を理由としている P0618R0 Deprecating 採択後の C++17標準ライブラリ仕様でも、`codecvt`, `codecvt_byname` という特殊化は有効です。つまりこの時点では「UTF-8 ⇔ UTF-16/32エンコーディング変換は問題ない(少なくとも非推奨化する理由はない)」という合意形成があった(今もある)と思われます。 C++17 [locale.codecvt]/paragraph 3より引用します(下線部は回答者による強調): > > The specializations required in Table 69 (25.3.1.1.1) convert the implementation-defined native character set. `codecvt` implements a degenerate conversion; it does not convert at all. **The specialization `codecvt` converts between the UTF-16 and UTF-8 encoding forms, and the specialization `codecvt ` converts between the UTF-32 and UTF-8 encoding forms.** `codecvt` converts between the native character sets for narrow and wide characters. Specializations on `mbstate_t` perform conversion between encodings known to the library implementer. Other encodings can be converted by specializing on a user-defined `stateT` type. Objects of type `stateT` can contain any state that is useful to communicate to or from the specialized `do_in` or `do_out` members. > > > P0482R0 char8_t: A type for UTF-8 characters and strings の目的は「UTF-8を表現する`char8_t`型の導入」ですから、単にこの趣旨に沿った調整(`char`→`char8_t`置換)を行っただけではないでしょうか?