vine3.2 gcc 3.3.2
の環境で以下のソースをコンパイルして、ターミナルで実行しても
何も出力されません。
#include <iostream>
#include <locale>
using namespace std;
int main()
{
locale jp("japanese");
wstring str = L"漢字";
wcout.imbue(jp);
wcout << str << endl;
return 0;
}
eucjpに変換された"漢字"が出力されるのかと思ったのですけど。
295 :
294:2006/10/17(火) 05:04:44
windowsXPだと正しく動作するのですけどね。
Vine3.2のwchar_tってUnicodeなの? EUC fixed widthだったりしない?
Windowsばかり使ってるとwchar_t=Unicodeと思い込みがちだけど
>>296 確かに、Vine3.2は未だ内部コードにEUCJPを使っています。
それは私も知っていました。
しかし、wchar_tがUCS2(もしくはUTF16)でないとは。
今までASCIIしか使っていなかったので知りませんでした。
仕様ではwchar_tが2バイト文字だとしか言及されていないのですね。
扱いづらいような・・・・・。
sizeof(wchar_t)くらい実行してみろ。
>297
wchar_tが2バイトということすら規定されていない。
いずれかの整数型と等しいと規定されているだけ。
現実にはUTF-16かUTF-32(或いはUCS2/UCS4)の実装が多いと俺は思っているけど。
> 現実にはUTF-16かUTF-32(或いはUCS2/UCS4)の実装が多いと俺は思っているけど。
最近はLinuxもUTF-8ロケールが増えつつあるしおおむねそういう手抜きができるように
なってきたと思うけど一昔前の日本語UNIX環境ではまったく正しくなかった。
ちなみにUCSであることを保証したければ__STDC_ISO_10646__というマクロがある。
301 :
297:2006/10/17(火) 22:53:36
linuxだとwchar_tは4バイトなんですね。
そういえば以前にD言語をいじったときに知ったのでした。
それにしても、wstring::findの返り値も実装ごとに違うよ
うですし、ワイド文字の扱いって大変そうですね。
指針がないかちょっと調べてみます。
もし参考になるサイト等ございましたら教えて頂ければ幸
いです。
302 :
297:2006/10/17(火) 23:12:24
>>294 libstdc++はimbueに対応していないっぽい。
代わりに大域ロケールをセットすれば良い。
それから、"japanese"というロケールは普通ないので、
"ja_JP.eucJP"とか""とかを使う。
#include <iostream>
#include <locale>
using namespace std;
int main()
{
locale::global(locale(""));
wstring str = L"漢字";
wcout << str << endl;
return 0;
}
codecvtクラス使ってくれ。@libstdc++