5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Linuxって wsprintf 使えないぞ

1 :デフォルトの名無しさん:01/10/09 08:00
今、プログラムを全部ワイド文字化してるんだけど、
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 関数じゃないの?

2 :デフォルトの名無しさん:01/10/09 08:06
------------------------------終了-------------------------

3 :デフォルトの名無しさん:01/10/09 08:25
>>1 はこのスレで何をしようというのでしょう?
Linux を叩きをしたいのでしょうか?
自分の馬鹿を晒したいのでしょうか?
すれ立てるまでもない質問スレに誘導してほしいのでしょうか?

4 :1:01/10/09 08:26
>>2-3
関係ないことは書かないでください

5 :デフォルトの名無しさん:01/10/09 08:34
>>1 プログラム(の一部)と、文字コードを教えてね。

6 :デフォルトの名無しさん:01/10/09 09:31
マジレス。

sprintfがANSIです。
wsprintfはWin16でプログラムが大きくなりすぎて、
リンクエラーおこしたときに差し替えるためのsprintfの小型サブセット版です。
同じようなものとして、strcpyに対するlstrcpyとかあります。

7 :デフォルトの名無しさん:01/10/09 09:56
>>6 Windows じゃなくて Linux の話ですよ

8 :デフォルトの名無しさん:01/10/09 09:59
>>7
そもそも>>1のスレタイトルが間違ってるんだから仕方が無い。

9 :とおりすがりの厨房:01/10/09 10:03
>>1
wsprintfってANSIでもなく、単にMS-Windowsの関数なのでは?
(ってゆうかネタなんすか?)

10 :デフォルトの名無しさん:01/10/09 10:04
>>8
wsprintf が Windows の user32.lib に入っている関数で、
swprintf が Linux でも使える ANSI 関数ですね。

11 :デフォルトの名無しさん:01/10/09 10:11
久しぶりに破壊力のあるヴァカっぷりを見ました。

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

そして、永遠にさようなら。

12 :デフォルトの名無しさん:01/10/09 10:25
次回からはこちらでどうぞ

***すれ立てるまでもない質問はここで 第5刷***
http://piza2.2ch.net/test/read.cgi/tech/1001998049/

13 :デフォルトの名無しさん:01/10/09 11:39
(・∀・)イイ!仕事してますねぇ〜

14 : :01/10/09 12:39
こんなことかいてると
ゴルゴ13に吉野屋の話をされてしまうぞ>>1

15 :実況:01/10/09 12:45
さぁ〜て、>>14のフリに呼応する強者は現れるのでしょうか!?

16 ::01/10/09 16:13
>swprintf が Linux でも使える ANSI 関数ですね。

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

stdio.h とか wchar.h とか、ヘッダー片っ端から探したけど入ってない。
とうぜんリンクもエラーになる。
manには書いてあるのに何故? 嘘ついてるわけ?
あって当然だとおもうし、どうしたら使えるようになるんでしょうか?

17 :デフォルトの名無しさん:01/10/09 16:21
Redhat6.2 の日本語版ですか?

18 :デフォルトの名無しさん:01/10/09 17:17
>>1
>manには書いてあるのに何故? 嘘ついてるわけ?
自分の無知を人のせいにするな
C99からの追加部分を利用出来るようにすればいいだけ
一行追加するだけなんだから、そのくらいは自分で調べろ

19 ::01/10/09 17:55
>>18
一行追加って具体的にどうするんですか?
C99関連って検索してもそれらしい事見つからないけど。

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

どこのHP検索しても
<stdio.h>
<wchar.h>
をインクルードすれば普通に使えるようにしか書かれてないようですが。

20 :デフォルトの名無しさん:01/10/09 18:01
>>19
それでは、コンパイラ名とバージョン、コンパイラをどのようにインストールしたか、教えてください。

21 ::01/10/09 18:36
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)

22 :デフォルトの名無しさん:01/10/09 21:28
ケッ、エラソーニ

23 :デフォルトの名無しさん:01/10/09 22:10
C99というヒントを与えているのに分からないようなら諦めろ

24 ::01/10/09 23:36
>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 に突っ込んだだけに見えます。
漢字の上位バイトと下位バイトが別々に格納されてる・・・

なんかめちゃくちゃな作りになってると思うのは私だけですか?

25 :デフォルトの名無しさん:01/10/09 23:45
漢字の文字コードがばらばらに4文字と\0で5文字ぶん。
1文字4バイト?で合計 20バイト、ということなのでしょうか。
それより、日本語文字を認識してくれているのか気になります。

26 :デフォルトの名無しさん:01/10/09 23:58
sizeof(wchar_t) == 4 で日本語は認識していない。
ということなんじゃないの?
日本語なんか認識しないでしょ、ふつー。

27 :デフォルトの名無しさん:01/10/10 00:38
>>16
偉そうだな。

誰も知らないよ。

どっか逝けっつ〜の。

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

29 :デフォルトの名無しさん:01/10/10 22:53
ドラも、知りたいです
教えてください

ヘッダーを見る限り、無理なようなきもするのですが
使えるなら、使いたいです
よろしくお願いします

30 :デフォルトの名無しさん:01/10/10 23:07
{}が余分な気がする。

31 :デフォルトの名無しさん:01/10/11 03:09
>>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を使用するようにしないといかんのだが。

32 :デフォルトの名無しさん:01/10/11 03:48
???
Linux使ってるけど、 printf("漢字"); で漢字が出るからいいん
じゃない?
なんでOSや言語に任せればいいことでそんなにムキになんの?

33 :低速たん:01/10/11 03:51
>>32
日本語しか興味ない人でも、wide character使わないと
とりあえず文字境界探すのが面倒よ。

というかむしろ言語にまかせようよ、という話をしていると
思われ。

34 :デフォルトの名無しさん:01/10/11 14:05
>>32
頑張ってすべてL10Nしてくれ。

35 :OCALIZATIO:01/10/11 15:29
俺達、また略されたよ…
たまには書いてくれ…

36 :デフォルトの名無しさん:01/10/11 18:41
タイトルのアホサデ思わず見てしまった。

37 :NTERNATIONALIZATIO:01/10/11 19:23
>>35
俺はもうあきらめたよ!

38 :デフォルトの名無しさん:01/10/11 20:14
>>31
> 日本語localeでコンパイルし実行すれば期待通りの動作をするはず。

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

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

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

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

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

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

ではなく。gccはerrorにならなくて、後者のように前者をcompileしてるけど。
そうは思えないんだけどねー。

39 :デフォルトの名無しさん:01/10/11 20:20
>>31

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

マジ教えて〜。お勧めの国際化プログラミングの本は?

40 :デフォルトの名無しさん:01/10/11 20:25
共立から出ている「国際化プログラミング I18Nハンドブック」一万円。
JISから出ている規格書。JISは国際化だけC言語と別の冊子になっている。

41 :39:01/10/11 21:46
40(=31?)さん、ありがとう。
とりあえず共立の方を探してみます。

42 :ULTILINGUALIZATIO:01/10/11 22:00
>>37
同志よ!

43 :デフォルトの名無しさん:01/10/11 22:14
YPERNIKKISYSTE
同士よ!

44 :デフォルトの名無しさん:01/10/11 22:47
>>43
だいぶ格調が下がったな。。。

45 :デフォルトの名無しさん:01/10/12 01:42
使えなくて当然だろ!
とレスを全く読まずに書いてみる。
多分予想通りの展開だと思うが。

12 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)