wchar_t
,char16_t
、またはchar32_t
の値を狭いostreamに入力すると、コードポイントの数値が出力されます。iostreams - `wchar_t`または` charXX_t`値を文字として出力
#include <iostream>
using std::cout;
int main()
{
cout << 'x' << L'x' << u'x' << U'x' << '\n';
}
プリントx120120120
。これは、basic_ostream
とcharT
の特定の組み合わせに対してoperator<<
が存在するためですが、他の文字タイプには類似の演算子がないため、黙ってint
に変換されて印刷されます。同様に、非狭い文字列リテラル(L"x"
、u"x"
、U"X"
)はサイレントvoid*
に変換され、オブジェクト(wstring
、u16string
、u32string
)があってもコンパイルされませんポインタ値、及び非狭い列として印刷されます。
だから、質問:文字としてではなく、コードポイントの数値として、狭いのostreamにwchar_t
、char16_t
、またはchar32_t
値を印刷する少なくともひどいな方法は何ですか? すべて ostreamのエンコーディングで表現可能なコードポイントをそのエンコーディングに正しく変換する必要があり、コードポイントが表現できないときにエラーを報告する必要があります。 (例えば、u'…'
所与とUTF-8のostreamは、3バイトのシーケンス0xE2 0x80では0xA6ストリームに書き込まなければならない;しかしu'â'
所与とKOI8-R用のostreamは、エラーが報告されるべきである。)同様
どのように非狭いC文字列または文字列オブジェクトを狭いostreamに出力して、出力エンコーディングに変換できますか?
これはISO C++ 11では実行できない場合は、プラットフォーム固有の回答を取ります。
は(this questionからインスピレーションを受けている。)
要するに、1)ワイドostreamを使用するか、2)ワイド文字データを自分自身の狭いエンコーディングに変換する必要があります。 ostreamはあなたのためにその変換を行うことはできません。 ['std :: wstring_convert'](http://en.cppreference。com/w/cpp/locale/wstring_convert)を使用するか、[ICONV](https://www.gnu.org/software/libiconv/)または[ICU](http://site.icu-project。 org /)。 –