スポンサーリンク

| キーワード:

wstring+wcoutでなぜlocaleするのか

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;

}


localeを入れた場合の結果


localeを入れなかった場合の結果

なぜ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へ変換して出力する。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: