○[C言語] wchar_t != WCHAR && UCS2 != UTF16

ytqwertyさんとこより

ただC標準とはいえWindowsですとUTF-16になる(からパックとも言い切れない)関数なんですよmbなんたらは。

あーMSVCだとtypedef unsigned short wchar_tですからねぇ。

んでもMSVCのmbstowcs/wcstombsってサロゲートペア喰わせてもEILSEQにはならないんでしたっけ?

＃ 手元のWin2k + VC++6だとBMP外の文字のあるロケール動かんので試せないのだけど

＃ GB18030サポートキットとか入れるとsetlocaleでGB18030ロケールって使えるのだろーか。

でないとwchar_t1文字でその文字集合のすべての文字を表せないので、明らかに規格違反だ(汗。

http://www.opengroup.org/onlinepubs/009695399/basedefs/stddef.h.html

Integer type whose range of values can represent distinct wide-character codes for all members of the largest character set specified among the locales supported by the compilation environment:

規格ではwchar_tは最低charのサイズあればいいのですが

16bit wchar_tじゃUCS2=BMPまでしか扱えませんゴメンなさい、だから

32bit wchar_tにしてUCS4まで扱えるようとっとと移行します、となかなかならんもですね。

＃ っても互換性の問題もあるしなあ。

まあ今 ISO/IEC TR19769New character type in Cみたいな話があるので、そのうち

16bit wchar_t前提で書いたレガシーコード → char16_t

新規に書いたコードは32bit wchar_t → char32_t

#if defined(WCHAR_T_AS_UCS2) #define wchar_t char16_t #else #define wchar_t char32_t #endif

というソレナンテTCHARなやり方で移行を考えてるのかもしれませんが。

いやよう知らんけど。

＃ ってもmbrtoc{16,32}は戻り値(size_t)-3なんてあるし

＃ すんなりマクロによる置換は無理だと思いますけどね、 参考コード

結局MSVCのwchar_tは内部UCS2、Win32APIのWCHARはUTF-16で

同じtypedef unsigned shortとはいえ両者は似て非なるもの

(wchar_t != WCHAR && UCS2 != UTF16)だと思うのですよ。

決して混ぜないよう気をつけてコード書くべきなんですが、もう無理かもな。

やぱしwchar_tを使うってことは、ISO-Cにのっとって移植性のあるコードを書くということだと思います。

そもそもwchar_tがUCS4であることを仮定して書いたコードには移植性はありません。

仮にwchar_t=UCS4を__STDC_ISO10646__を盾に認めさせたとしても

wchar_t=UCS2(これはUCS4はUCS2のスーパーセットなのでOK)ならばwchar_t=UTF16でもいいだろうと

サロゲートペア処理するなんてのはwchar_t=1文字という規格すらぶち壊すことになりますやね *1 。

wchar_t=UTF16が都合がいい、という理由ってのはどうせWin32APIの要求なわけですし

それなら移植性もへったくれもないのでwchart_t/mbrtowc/wcrtombなんぞ使わず

WCHAR/MultiByteToWideChar/WideCharToMultiByteを必ず使えってことですな。

I18N本はやっぱり買う必要があるのかなあ……高い。

あと kbkさんとこ

I18N本って「いちまんえん」もする本じゃないですか。

高価な本って不幸の手紙みたいなもんで、他の人に薦めたく(以下略

I18N本は第I章＋第II章は国際化プログラミングとは何ぞや? って人には

プログラムを書くときに何を意識すれば良いのかを知るためには優れた内容だと思います。

でもやっぱり第III章実践編はちょっと内容が古くなってますかね。

Unix Cはそもそも化石なので問題ないのですが、X Motif/CDEは今となっては

GTK+/Gnome, QT/KDEあたりの話に触れておく必要があるでしょう。

んでWindowsの話はほんとに僅かなので、そっち系プログラマは肩透かしになると思います。

Javaの話もJSR-204にあわせて書き換えられる必要がありますな。

あとこんだけ若い人の興味がLL方面に向いてる今、そっち系のネタが無いのも辛いかも。

まあ国際化プログラミングとは何ぞがわかっているなら無理して買う必要は無いですね。

国際化関数の使い方なんてそれこそマニュアル読めばいいわけですし。