文字コード総合スレ part2

このエントリーをはてなブックマークに追加
294デフォルトの名無しさん
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に変換された"漢字"が出力されるのかと思ったのですけど。
295294:2006/10/17(火) 05:04:44
windowsXPだと正しく動作するのですけどね。
296デフォルトの名無しさん:2006/10/17(火) 05:36:40
Vine3.2のwchar_tってUnicodeなの? EUC fixed widthだったりしない?
Windowsばかり使ってるとwchar_t=Unicodeと思い込みがちだけど
297デフォルトの名無しさん:2006/10/17(火) 14:41:14
>>296
確かに、Vine3.2は未だ内部コードにEUCJPを使っています。
それは私も知っていました。
しかし、wchar_tがUCS2(もしくはUTF16)でないとは。

今までASCIIしか使っていなかったので知りませんでした。
仕様ではwchar_tが2バイト文字だとしか言及されていないのですね。

扱いづらいような・・・・・。
298デフォルトの名無しさん:2006/10/17(火) 16:04:06
sizeof(wchar_t)くらい実行してみろ。
299デフォルトの名無しさん:2006/10/17(火) 18:31:44
>297
wchar_tが2バイトということすら規定されていない。
いずれかの整数型と等しいと規定されているだけ。

現実にはUTF-16かUTF-32(或いはUCS2/UCS4)の実装が多いと俺は思っているけど。
300デフォルトの名無しさん:2006/10/17(火) 20:22:48
> 現実にはUTF-16かUTF-32(或いはUCS2/UCS4)の実装が多いと俺は思っているけど。
最近はLinuxもUTF-8ロケールが増えつつあるしおおむねそういう手抜きができるように
なってきたと思うけど一昔前の日本語UNIX環境ではまったく正しくなかった。
ちなみにUCSであることを保証したければ__STDC_ISO_10646__というマクロがある。
301297:2006/10/17(火) 22:53:36
linuxだとwchar_tは4バイトなんですね。
そういえば以前にD言語をいじったときに知ったのでした。
それにしても、wstring::findの返り値も実装ごとに違うよ
うですし、ワイド文字の扱いって大変そうですね。
指針がないかちょっと調べてみます。

もし参考になるサイト等ございましたら教えて頂ければ幸
いです。
302297:2006/10/17(火) 23:12:24
早速参考になるサイトを発見しました。
http://eside.homeip.net/columns/i18n.html

プラットフォームの違いを吸収するような方法は無いということですか。
古い記事ですが。
303デフォルトの名無しさん:2006/10/20(金) 12:06:10
>>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;
}
304デフォルトの名無しさん:2006/10/20(金) 12:40:56
codecvtクラス使ってくれ。@libstdc++