iostreamとwchar_t

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tk-xleader

iostreamとwchar_t

#1

投稿記事 by tk-xleader » 17年前

iostreamを使ってワイド文字を出力しようとしたのですが、なぜかその文字の文字コードが出力されてしまいます。
ロケールの設定はしていますが、アルファベットですら文字コードになってしまいます。しかし、typeidによって確認した結果、wchar_t型で間違いはないようです。
環境はWinXP+VC2005アカデミック版です。お願いします。
#include<iostream>
#include<locale>
#include<typeinfo>
using namespace std;

int main()
{
	setlocale(LC_ALL,"");
	cout<<L"あ,"<<L'あ'<<endl;//あ,あと表示されるはず
	cout<<typeid(L'あ').name()<<endl;//とりあえず型を確認しておく
	return 0;
}

tk-xleader

Re:iostreamとwchar_t

#2

投稿記事 by tk-xleader » 17年前

追加です。

wchar_t型の文字列を渡すと文字コードどころか文字列へのアドレスが出力されるようです。

その他、wstringに代入してからcoutに渡すと、<<演算子がwstringクラスに対して定義されていないというエラーがでます。
どういうことでしょうか?

Blue

Re:iostreamとwchar_t

#3

投稿記事 by Blue » 17年前

wcoutを使ってください。

std::wcout.imbue(std::locale("japanese"));

の記述も忘れずに。

たかぎ

Re:iostreamとwchar_t

#4

投稿記事 by たかぎ » 17年前

std::basic_string クラステンプレートの出力は、
template <class charT, class traits, class Allocator>
basic_ostream<chaT, traits>& operator<<(basic_ostream<charT, traits>&, const basic_string<chaT, traits, Allocator>&);
のようになっています。
そのため、charT が異なる文字列とストリームの組み合わせでは使うことができません。
これを解決するには、std::wcout を使うのが筋ですが、std::cout に対して出力したいこともありますよね。
そんな場合は、手前味噌ですが、下記のページに記述しているコードを使うとよいでしょう。

http://www.kijineko.co.jp/tech/cpptempl ... l/io#103.3

↑は、const wchar_t*の出力に関するサンプルですが、const std::wsring& に応用するのも簡単にできるはずです。

tk-xleader

Re:iostreamとwchar_t

#5

投稿記事 by tk-xleader » 17年前

Blueさん、たかぎさん、ありがとうございます。

ありがとうございます。wcoutにすればいいのですね。

閉鎖

“C言語何でも質問掲示板” へ戻る