• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class template
    <codecvt>

    std::codecvt_utf8

    namespace std {
      template <class Elem, unsigned long Maxcode = 0x10ffff,
                codecvt_mode Mode = (codecvt_mode)0>
      class codecvt_utf8 : public codecvt<Elem, char, mbstate_t> {
        // 未規定...
      };
    }
    

    概要

    UTF-8との変換を行うファセットクラス。char列とElem列との間で、以下のようにエンコーディングの変換を行う機能を有する。

    • char: UTF-8エンコーディングのマルチバイト文字列。
    • Elem: UCS-2またはUCS-4 (UTF-32)。char16_tなど2バイトの型を指定するとUCS-2、char32_tなど4バイトの型を指定するとUCS-4として扱われる。

    BOMの有無をcodecvt_modeで指定できる。

    非推奨・削除の詳細

    Unicodeの文字コード変換を行うこれらのクラスは、不正なコードポイントに対する安全なエラー処理の方法を提供していなかったため、セキュリティ上の欠陥があった。

    仕様もあいまいであったため、不正なコードポイントに対してどのように振る舞うかも不明であった。

    Unicode以外のShift_JISやBig5といった文字コードの利用が急激に減少している。標準ライブラリでの現代的なUnicodeの変換機能は非常に必要とされているが、<codecvt>の設計はお粗末なものだった。将来より良いものを作るために、これらの機能は非推奨・削除とする。

    標準ライブラリにUnicodeの文字コード変換をする代替機能はないため、他の専門特化した文字コード変換のライブラリを使用すること。

    #include <codecvt>
    #include <string>
    #include <cassert>
    #include <locale>
    
    int main()
    {
      std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> converter;
    
      // UCS-4/UTF-32からUTF-8に変換
      std::u32string u32str = U"\U0001F359";
      std::string u8str = converter.to_bytes(u32str);
    
      assert(u8str.size() == 4);
      assert(u8str[0] == '\xf0');
      assert(u8str[1] == '\x9f');
      assert(u8str[2] == '\x8d');
      assert(u8str[3] == '\x99');
    
      // UTF-8からUCS-4/UTF-32に変換
      std::u32string restored = converter.from_bytes(u8str);
      assert(u32str == restored);
    }
    

    出力

    上記プログラムは何も出力しない。

    バージョン

    言語

    • C++11

    処理系

    参照