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_t
char32_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_t
16 ~ 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_t
char32_t
unsigned short
unsigned int
codecvt
char16_t
char32_t