C++11 では、さまざまな UTF -xと UCS xの文字シーケンスcodecvt間の変換を目的とした追加の標準の特殊化と型があります。これらのいずれかがニーズに合う場合があります。
で<locale>:
std::codecvt<char16_t, char, std::mbstate_t>: UTF-16 と UTF-8 の間で変換します。
std::codecvt<char32_t, char, std::mbstate_t>: UTF-32 と UTF-8 の間で変換します。
で<codecvt>:
std::codecvt_utf8_utf16<typename Elem>: UTF-8 と UTF-16 の間で変換します。ここで、UTF-16 コード ポイントは指定されたとおりに格納されます(が指定されている場合、 ごとに 1 つのコード ポイントのみが格納されることにElem注意してください)。
char32_tchar32_t
- 2 つの追加の既定のテンプレート パラメータ (
unsigned long MaxCode = 0x10ffff、およびstd::codecvt_mode Mode = (std::codecvt_mode)0) があり、 から継承しstd::codecvt<Elem, char, std::mbstate_t>ます。
std::codecvt_utf8<typename Elem>Elem: ( の場合は UCS2 、 の場合char16_tは UCS4 、 の場合char32_tはプラットフォームに依存)に応じて、UTF-8 と UCS2 または UCS4 のいずれかとの間で変換しwchar_tます。
- 2 つの追加の既定のテンプレート パラメータ (
unsigned long MaxCode = 0x10ffff、およびstd::codecvt_mode Mode = (std::codecvt_mode)0) があり、 から継承しstd::codecvt<Elem, char, std::mbstate_t>ます。
std::codecvt_utf16<typename Elem>Elem: ( の場合は UCS2 、 の場合char16_tは UCS4 、 の場合char32_tはプラットフォームに依存)に応じて、UTF-16 と UCS2 または UCS4 のいずれかとの間で変換しwchar_tます。
- 2 つの追加の既定のテンプレート パラメータ (
unsigned long MaxCode = 0x10ffff、およびstd::codecvt_mode Mode = (std::codecvt_mode)0) があり、 から継承しstd::codecvt<Elem, char, std::mbstate_t>ます。
codecvt_utf8のcodecvt_utf16サイズに応じて、指定された UTF と UCS2 または UCS4 の間で変換されますElem。 したがって、wchar_t16 ~ 31 ビットのシステム (16 ビットの Windows など) では UCS2 を指定し、少なくとも 32 ビットのシステム (32 ビットの Linux など) では UCS4 を指定します。wchar_t文字列が実際にそのエンコーディングを使用するかどうかに関係なく; 文字列に異なるエンコーディングを使用するプラットフォームでwchar_tは、注意しないと当然問題が発生します。
詳細については、CPP リファレンスを参照してください。
ヘッダーのサポートcodecvtが追加されたのはlibstdc++比較的最近であることに注意してください。古いバージョンの Clang または GCC を使用している場合は、使用する必要がある場合がありlibc++ます。2015 より前のバージョンの Visual Studio は、実際にはand を
サポートしていないことに注意してください。これらの型が以前のバージョンに存在する場合は、それぞれおよびの typedef になります。また、古いバージョンの Visual Studio では、UTF エンコーディング間で文字列を変換する際に問題が発生する場合があり、Visual Studio 2015 には、とが正しく機能しない不具合があり、代わりに同じサイズの整数型を使用する必要があることに注意してください。char16_tchar32_tunsigned shortunsigned intcodecvtchar16_tchar32_t