最終更新日時(UTC): 2025年07月08日 15時33分39秒
Akira Takahashi が更新

履歴 編集

class template
<codecvt>

# std::codecvt_utf16(C++11)(C++17で非推奨)(C++26で削除)

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

## 概要

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

- `char`: UTF-16エンコーディングのマルチバイト文字列。
- `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_utf16<char32_t>, char32_t> converter;

      // UCS-4/UTF-32からUTF-16に変換
      std::u32string u32str = U"\U0001F359";
      std::string u16str = converter.to_bytes(u32str);

      assert(u16str.size() == 4);
      assert(u16str[0] == '\xd8');
      assert(u16str[1] == '\x3c');
      assert(u16str[2] == '\xdf');
      assert(u16str[3] == '\x59');

      // UTF-16からUCS-4/UTF-32に変換
      std::u32string restored = converter.from_bytes(u16str);
      assert(u32str == restored);
    }

### 出力

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

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 5.1 ✅
- ICC: ?
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅, 2017 ✅

## 参照

- N2401 Code Conversion Facets for the Standard C++ Library
- P0618R0 Deprecating `<codecvt>`
- P2871R3 Remove Deprecated Unicode Conversion Facets from C++26