Unicodeはどんな文字でも対応してるからwstringをwcoutすれば何でも表示出来るはず
#include <iostream> #include <string> int main() { std::locale::global(std::locale("japanese"));// ① std::wstring hello = L"こんにちは"; std::wcout << hello; getchar(); return 0; }
なぜUnicodeなのにsetlocaleしなければ文字が出力出来ないか。
それは、
コマンドプロンプトがShift-JISしか表示出来ないため、
wcoutはShift-JISで文字列を出力せねばならず、
wcout自身は自分がどんな環境で動いているか関知していないので、
localeでShift-JIS環境だと教えてあげる必要がある
という理屈からだ。
自分が作ったアプリケーション内で、どのように文字列を処理しようがそれは作った者の自由だ。別にshift-jisやunicodeである必要はない。必要があれば自分定義した文字コードで書いたっていい(もの凄い労力だろうが)。
しかし、それを出力するなら、出力先の仕様に合わせる必要がある。出力先がどんな文字コードに対応しているかを教えるのがlocaleの役目となる。
#include <iostream> #include <string> #include <fstream> int main() { std::locale::global(std::locale("japanese"));// ① std::wstring hello = L"こんにちは"; std::wofstream wof(L"test.txt"); wof << hello; return 0; }
ファイル出力に関しても同様で、Lをつけてワイド文字指定しても、wofstreamが自動的にShift-JISへ変換して出力する。