ヘッダー ファイル locale で宣言されている便利なインターフェイスが 2 つあります:std::wstring_convert
とstd::wbuffer_convert
. ただし、使用例はありません。
それらの使用法と違いを説明するための簡潔な例はありますか?
ヘッダー ファイル locale で宣言されている便利なインターフェイスが 2 つあります:std::wstring_convert
とstd::wbuffer_convert
. ただし、使用例はありません。
それらの使用法と違いを説明するための簡潔な例はありますか?
std::wstring_convert
要素の形式でUTF-32コード単位を保持するstd::u32string
(別名)が与えられた場合、バイト形式のUTF-8コード単位のシーケンスに変換する方法は次のとおりです。std::basic_string<char32_t>
char32_t
// Both <locale> and <codecvt> required
std::u32string input = U"Hello, World";
using Codecvt = std::codecvt_utf8<char32_t>;
std::wstring_convert<Codecvt, char32_t> converter;
// throws std::range_error if the conversion fails
std::string result = converter.to_bytes(input);
の癖はstd::wstring_convert
、標準がワイド文字列(実際にはstd::basic_string
を含むのあらゆる種類の特殊化std::string
)と呼ぶものを、フォームの特殊化であるバイト文字列に、またはバイト文字列から常に変換することであることに注意してくださいstd::basic_string<char, std::char_traits<char>, Allocator>
。
ソースとターゲットのエンコーディングは、使用されているコード変換ファセットによって異なります。ここでは、からのストックファセットの1つを使用しています<codecvt>
。コード変換ファセットは、破壊可能である限り機能しますが、これは当てはまりません。たとえばstd::codecvt<wchar_t>
、保護されたデストラクタがあります。
std::wbuffer_convert
うまくいけば説得力のあるユースケースは次のとおりです。UTF-8でエンコードされたテキストを期待する(別名)out
のインスタンスであるオブジェクトがあります。したがって、たとえば、問題なく動作するはずです。ただし、そうなると、プログラム内の別の場所からのUTF-32でエンコードされたワイド文字列(そのジョブの最適な候補は)が多数あり、これをに渡す必要があります。繰り返し使用することもできますが、すぐに古くなる可能性があります。std::ostream
std::basic_ostream<char>
out << u8"Hello"
std::u32string
out
std::wstring_convert
別の方法は次のとおりです。
std::wbuffer<std::codecvt_utf8<char32_t>, char32_t> wout { out.rdbuf() };
std::u32string input = U"Hello";
wout << input;
つまり、UTF-32でエンコードされたテキストout
のインスタンスであるかのように動作し、ロケールを変更しなかったというビューを取得できます(最後のビットは、これらの便利なインターフェイスが最初に存在する大きな理由ですstd::basic_stream<char32_t>
)。
それは競合他社ではなくstd::wbuffer_convert
補完的なものだと思います。std::wstring_convert
免責事項として、私はこれらの機能またはのいずれかをサポートする実装を手に入れていないため、<codecvt>
ここのコードは完全にテストされていません:(。