トップページ⇒tech
45コメント14KB

Linuxって wsprintf 使えないぞ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
今、プログラムを全部ワイド文字化してるんだけど、
Linux(RedHat 6.2) でコンパイルしたところ
wprintf
swprintf
が使えない。

man で見てみるとちゃんと

wprintf, fwprintf, swprintf, vwprintf, vfwprintf, vswprintf - ワイド文字をフォーマットして出力する

書式
#include <stdio.h>
#include <wchar.h>

int wprintf (const wchar_t* format, ...);
int fwprintf (FILE* stream, const wchar_t* format, ...);
int swprintf (wchar_t* wcs, size_t maxlen,
const wchar_t* format, ...);

って書いてあるのに。
何故?
ANSI 関数じゃないの?
0002デフォルトの名無しさんNGNG
------------------------------終了-------------------------
0003デフォルトの名無しさんNGNG
>>1 はこのスレで何をしようというのでしょう?
Linux を叩きをしたいのでしょうか?
自分の馬鹿を晒したいのでしょうか?
すれ立てるまでもない質問スレに誘導してほしいのでしょうか?
00041NGNG
>>2-3
関係ないことは書かないでください
0005デフォルトの名無しさんNGNG
>>1 プログラム(の一部)と、文字コードを教えてね。
0006デフォルトの名無しさんNGNG
マジレス。

sprintfがANSIです。
wsprintfはWin16でプログラムが大きくなりすぎて、
リンクエラーおこしたときに差し替えるためのsprintfの小型サブセット版です。
同じようなものとして、strcpyに対するlstrcpyとかあります。
0007デフォルトの名無しさんNGNG
>>6 Windows じゃなくて Linux の話ですよ
0008デフォルトの名無しさんNGNG
>>7
そもそも>>1のスレタイトルが間違ってるんだから仕方が無い。
0009とおりすがりの厨房NGNG
>>1
wsprintfってANSIでもなく、単にMS-Windowsの関数なのでは?
(ってゆうかネタなんすか?)
0010デフォルトの名無しさんNGNG
>>8
wsprintf が Windows の user32.lib に入っている関数で、
swprintf が Linux でも使える ANSI 関数ですね。
0011デフォルトの名無しさんNGNG
久しぶりに破壊力のあるヴァカっぷりを見ました。

>>1よ。いいもの見せてくれてありがとう。

そして、永遠にさようなら。
0012デフォルトの名無しさんNGNG
次回からはこちらでどうぞ

***すれ立てるまでもない質問はここで 第5刷***
http://piza2.2ch.net/test/read.cgi/tech/1001998049/
0013デフォルトの名無しさんNGNG
(・∀・)イイ!仕事してますねぇ〜
0014 NGNG
こんなことかいてると
ゴルゴ13に吉野屋の話をされてしまうぞ>>1
0015実況NGNG
さぁ〜て、>>14のフリに呼応する強者は現れるのでしょうか!?
00161NGNG
>swprintf が Linux でも使える ANSI 関数ですね。

スレタイトルまちがえました。すんません。
それはともかくとしてやっぱりLinuxでswprintf使えない。
そのことに関しては誰も知らないのかな?

stdio.h とか wchar.h とか、ヘッダー片っ端から探したけど入ってない。
とうぜんリンクもエラーになる。
manには書いてあるのに何故? 嘘ついてるわけ?
あって当然だとおもうし、どうしたら使えるようになるんでしょうか?
0017デフォルトの名無しさんNGNG
Redhat6.2 の日本語版ですか?
0018デフォルトの名無しさんNGNG
>>1
>manには書いてあるのに何故? 嘘ついてるわけ?
自分の無知を人のせいにするな
C99からの追加部分を利用出来るようにすればいいだけ
一行追加するだけなんだから、そのくらいは自分で調べろ
00191NGNG
>>18
一行追加って具体的にどうするんですか?
C99関連って検索してもそれらしい事見つからないけど。

ちなみにRedHat6.2日本語版で
/usr/include/
のヘッダ全部grepしたけどswprintfって見当たらないみたいです。

どこのHP検索しても
<stdio.h>
<wchar.h>
をインクルードすれば普通に使えるようにしか書かれてないようですが。
0020デフォルトの名無しさんNGNG
>>19
それでは、コンパイラ名とバージョン、コンパイラをどのようにインストールしたか、教えてください。
00211NGNG
OS、コンパイラは RedHat Linux 6.2 日本語版の製品を
デフォルト設定でインストールしたものです。

Red Hat Linux release 6.2 (Zoot)
Kernel 2.2.14-5.0smp on a 2-processor i686

Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
0022デフォルトの名無しさんNGNG
ケッ、エラソーニ
0023デフォルトの名無しさんNGNG
C99というヒントを与えているのに分からないようなら諦めろ
00241NGNG
>23
誰も実際にLinuxに触ったこと無いと思われる。
いいかげんなこと言わないで欲しい。

結局何にも答えてくれないので自己レス。

とりあえず別のLinux7.1サーバーにソース持っていって
コンパイルしたら swprintf は通りました。
結局Linux 6.2 じゃ対応してないのね。

しかし、また新たな問題が。

int main()
{
wchar_t test[]={ L"漢字"};
wprintf(L"%d %d\n", sizeof(wchar_t), sizeof(test));
wprintf(L"%d\n", wcslen(test));
return 0;
}

この結果が

4 20
4

どーゆー事?
wchar_t が2バイト or 4バイトになるというのはわかるけど
なんで20バイトも?
しかも文字列の長さ4って・・・・

gdb でデバッグしてみると
char1文字1文字 を unsigned int に突っ込んだだけに見えます。
漢字の上位バイトと下位バイトが別々に格納されてる・・・

なんかめちゃくちゃな作りになってると思うのは私だけですか?
0025デフォルトの名無しさんNGNG
漢字の文字コードがばらばらに4文字と\0で5文字ぶん。
1文字4バイト?で合計 20バイト、ということなのでしょうか。
それより、日本語文字を認識してくれているのか気になります。
0026デフォルトの名無しさんNGNG
sizeof(wchar_t) == 4 で日本語は認識していない。
ということなんじゃないの?
日本語なんか認識しないでしょ、ふつー。
0027デフォルトの名無しさんNGNG
>>16
偉そうだな。

誰も知らないよ。

どっか逝けっつ〜の。
0028デフォルトの名無しさんNGNG
>>25
glibc のバージョンとか gcc のコンパイル方法 (configure 時に --enable-c-mbchar
つけてるか)などの細かい点に依存しそうなので、ここよりも Linux 板か、同じディス
トリビューションを利用している人間が集まるめーリングリストで聞いた方が良いと思
う。
0029デフォルトの名無しさんNGNG
ドラも、知りたいです
教えてください

ヘッダーを見る限り、無理なようなきもするのですが
使えるなら、使いたいです
よろしくお願いします
0030デフォルトの名無しさんNGNG
{}が余分な気がする。
0031デフォルトの名無しさんNGNG
>>24
めちゃくちゃなのはお前の方。どんな環境で動かしても同じような
結果になる。まず、国際化プログラミング関係の本をちゃんと読み、
ワイドキャラクタやlocaleについて勉強しろ。

ISO C localeモデルに従ってプログラミングするには、まずsetlocaleを
呼び出してlocaleを設定しなければならない。特別なことをしないの
なら、setlocale(LC_ALL, "")を最初に呼び出し現在のlocaleで動作
するようにする。setlocaleを呼ばなければC localeで動作するので
日本語は当然認識されない。

--enable-c-mbchar付けてコンパイルしたgccならワイド文字列定数を
コンパイル時のlocaleに従って処理してくれるので、mainの直後に
setlocale(LC_ALL, "")を付け加え、日本語localeでコンパイルし実行
すれば期待通りの動作をするはず。

でも--enable-c-mbcharってバグっているっぽい、っていうかかなり
逝ってよしな仕様。ちゃんと国際化しないとだめじゃん。まあ、国際化
の作法に従うなら、C localeで扱えない文字をソースに埋め込まず、
catgetやgettextを使用するようにしないといかんのだが。
0032デフォルトの名無しさんNGNG
???
Linux使ってるけど、 printf("漢字"); で漢字が出るからいいん
じゃない?
なんでOSや言語に任せればいいことでそんなにムキになんの?
0033低速たんNGNG
>>32
日本語しか興味ない人でも、wide character使わないと
とりあえず文字境界探すのが面倒よ。

というかむしろ言語にまかせようよ、という話をしていると
思われ。
0034デフォルトの名無しさんNGNG
>>32
頑張ってすべてL10Nしてくれ。
0035OCALIZATIONGNG
俺達、また略されたよ…
たまには書いてくれ…
0036デフォルトの名無しさんNGNG
タイトルのアホサデ思わず見てしまった。
0037NTERNATIONALIZATIONGNG
>>35
俺はもうあきらめたよ!
0038デフォルトの名無しさんNGNG
>>31
> 日本語localeでコンパイルし実行すれば期待通りの動作をするはず。

つーか、すでに期待通りに動いているというか、
期待通りに動く事はないというか…

wchar_tの内部表現を変えたいなら、自分でcompilerを書いてくれないと。
そこに目をつぶれば、すでに期待通り。(setlocale()はANSI的に必要だが)

ところで、普段メッセージ・カタログ使っているから、L"漢字"知らないんだけど、

> wchar test[]={L"漢字"};

これはこれでいいものなの?

< wchar test[]=L"漢字";

ではなく。gccはerrorにならなくて、後者のように前者をcompileしてるけど。
そうは思えないんだけどねー。
0039デフォルトの名無しさんNGNG
>>31

>結果になる。まず、国際化プログラミング関係の本をちゃんと読み、
>ワイドキャラクタやlocaleについて勉強しろ。

マジ教えて〜。お勧めの国際化プログラミングの本は?
0040デフォルトの名無しさんNGNG
共立から出ている「国際化プログラミング I18Nハンドブック」一万円。
JISから出ている規格書。JISは国際化だけC言語と別の冊子になっている。
004139NGNG
40(=31?)さん、ありがとう。
とりあえず共立の方を探してみます。
0042ULTILINGUALIZATIONGNG
>>37
同志よ!
0043デフォルトの名無しさんNGNG
YPERNIKKISYSTE
同士よ!
0044デフォルトの名無しさんNGNG
>>43
だいぶ格調が下がったな。。。
0045デフォルトの名無しさんNGNG
使えなくて当然だろ!
とレスを全く読まずに書いてみる。
多分予想通りの展開だと思うが。
■ このスレッドは過去ログ倉庫に格納されています