6

ヘッダー ファイル locale で宣言されている便利なインターフェイスが 2 つあります:std::wstring_convertstd::wbuffer_convert. ただし、使用例はありません。

それらの使用法と違いを説明するための簡潔な例はありますか?

4

1 に答える 1

8

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::ostreamstd::basic_ostream<char>out << u8"Hello"std::u32stringoutstd::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>ここのコードは完全にテストされていません:(。

于 2013-02-11T07:48:27.337 に答える