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

履歴 編集

class template
<codecvt>

std::codecvt_utf8_utf16

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

概要

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

  • char: UTF-8エンコーディングのマルチバイト文字列。
  • Elem: UTF-16エンコーディングの文字列。

UTF-8文字列におけるBOMの有無をcodecvt_modeで指定できる。

非推奨・削除の詳細

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

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

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

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

#include <iostream>
#include <string>
#include <codecvt>
#include <cassert>
#include <locale>

int main()
{
  std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;

  // UTF-16からUTF-8に変換
  std::u16string u16str = u"\U0001F359";
  std::string u8str = converter.to_bytes(u16str);

  assert(u8str.size() == 4);
  assert(u8str[0] == '\xf0');
  assert(u8str[1] == '\x9f');
  assert(u8str[2] == '\x8d');
  assert(u8str[3] == '\x99');

  // UTF-8からUTF-16に変換
  std::u16string restored = converter.from_bytes(u8str);
  assert(u16str == restored);
}

出力

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

バージョン

言語

  • C++11

処理系

参照