プロが教える店舗&オフィスのセキュリティ対策術

C言語において、printf関数をつかって全角カタカナを表示しようとすると、文字化けが発生します。
puts関数を使うと文字化けは発生しないので、使用上は特に問題は無いのですが、原因は何でしょうか?文字コードに起因するものでしょうか?
ちなみに、OSはRedHatLinux9を使用しています。
宜しければ、回答お願い致します。

A 回答 (6件)

#2です。


文字コードがJISですので、これをEUCに変換すれば、あなたの望んだ結果が得られます。
コマンドライン上で
nkf -e  ソースファイル1 > ソースファイル2 と入力してください。
ソースファイル1は、あなたが作成したソースファイルです。これはJISコードになっています。ソースファイル2がEUCコードに変換されたファイルです。ソースファイル2をコンパイルすると、正しい結果が得られます。
尚、emacsの左下のところにエディット中のファイルの漢字コードが表示されるはずです。ソースファイル1の場合はEEJ、ソースファイル2の場合は、EEEと表示されるはずです。

この回答への補足

あと、便乗質問で申し訳ないのですが、デフォルトの漢字コードをiso-2022-jpからEUCに変更するにはどのようにしたらいいかご存じでしょうか?ご存じでしたら、手順を教えて頂きたいのですが、宜しくお願いします。

補足日時:2004/03/28 23:44
    • good
    • 0
この回答へのお礼

返事ありがとうございます。

>> nkf -e  ソースファイル1 > ソースファイル2

このコマンドを実行したあと再コンパイルしてみると、正常に表示されました。EUCに変更できるコマンドがあるんですね。是非、覚えておきます。

>>尚、emacsの左下のところにエディット中のファイの
>>漢字コードが表示されるはずです。ソースファイル
>>1の場合はEEJ、ソースファイル2の場合は、EEEと
>>表示されるはずです。

この点に関しては、私の環境では、ソースファイル1に関しては、-Jと表示され、ソースファイル2に関しては、
-Eと表示されます。が、特に問題は無いようです。

ご回答ありがとうございました。

お礼日時:2004/03/28 23:44

#4です。


>あと、便乗質問で申し訳ないのですが、デフォルトの漢字コードをiso-2022-jpからEUCに変更するにはどのようにしたらいいかご存じでしょうか?ご存じでしたら、手順を教えて頂きたいのですが、宜しくお願いします。
本件、私も多少このことを調査したのですが、残念ながら判りませんでした。
この件は、カテゴリをUnix系OSに変えて、質問すると良い回答が得られるかも知れません。
尚、直接の回答にはなりませんが、emacsはソースが既にEUCコードの漢字を含んでいれば、EUCコードで入力できるようになりますので、新規のプログラムを作る場合でも、前のソース(EUC漢字を含んだ)をコピーして、作るようにすれば、EUCコードでの入力ができるようになります。
    • good
    • 1
この回答へのお礼

何度も丁寧な回答ありがとうございます。

>>この件は、カテゴリをUnix系OSに変えて、質問する
>>と良い回答が得られるかも知れません。

そうですね。そうしてみます。

>>尚、直接の回答にはなりませんが、emacsはソースがに
>>EUCコードの漢字を含んでいれば、EUCコードで入力で
>>きるようになりますので、新規のプログラムを作る場
>>合でも、前のソース(EUC漢字を含んだ)をコピーし
>>て、作るようにすれば、EUCコードでの入力ができるに
>>なります。

なるほど、このやり方もありますね。変更の仕方が分かるまではこのやり方を使うことにします。

ありがとうございました。

お礼日時:2004/03/29 11:06

#3です。


>そうだったんんですね。てっきり、printf("データ")のように書くのが普通だと思っていました。

「あんまりごく普通ではありません。」と書きましたが、ちょっと誤解をまねくというかまずい表現でした。
JISでソースを書くのが意図的なら、#3で書いた方法を取るのが普通だと思いますが、1引数だけのprintfが普通でないとは思いません。
シフトJISやJIS(ISO-2022-JP等)をプログラム中で文字列として使うにはいろいろ制約(シフトJISだと\が含まれるとか)があるので、かなり意識してプログラムを書く必要があります。

JISコードである必然性が無いなら#4の書かれたようにEUC-JPにするのが楽です。プログラムの出力がJISである必要があるなら、ソースはEUC-JPで書いておいて
program | nkf -j
で、JISに変換することも出来ますからね。
    • good
    • 0
この回答へのお礼

何度も丁寧な回答ありがとうございます。

お礼日時:2004/03/29 11:01

>printf("データ"); のようにごく普通に文字列を並べたものであっても文字化けがします。



あんまりごく普通ではありません。

>文字コードは調べてみたところ、iso-2022-jpというものでした。

iso-2022-jpでの"データ"は、printf の書式制御文字である % を含んでますので、printf の第一パラメータに指定してはいけません。
printf("%s","データ");とか、fputs("データ",stdout); ではどうでしょうか?
"データ"に限らず、EUC-JP以外の漢字コードの文字列をprintfの第一パラメータに書かないほうがいいでしょう。fprintfの第二パラメータ等も同じ。
    • good
    • 0
この回答へのお礼

返事ありがとうございます。

>>iso-2022-jpでの"データ"は、printf の書式制御文で
>>ある % を含んでますので、printf の第一パラメーに
>>指定してはいけません。

そうだったんんですね。てっきり、printf("データ")のように書くのが普通だと思っていました。

>>printf("%s","データ");とか、fputs("データ
>>",stdout); ではどうでしょうか?

このようにすると、正常に表示されました。

>>"データ"に限らず、EUC-JP以外の漢字コードの文列
>>をprintfの第一パラメータに書かないほうがいいで
>>しょう。fprintfの第二パラメータ等も同じ。

そうですね。次回からは気をつけたいと思います。

ご回答いただきありがとうございました。

お礼日時:2004/03/28 23:34

想像する文字コードの問題だと思われます。


EUCコードがデフォルトの文字コードであると言う前提で、
データと書いたのが、SJISかJISになっています。
この「データ」の全角カナ文字は、どのようにして作成されましたでしょうか。
端末でエディタで、直接作成した場合は、その漢字コードが何になっているか調べてください。この方法が判らないときは、エディタは何を使用しているか、提示してください。
又、このソースをWindowsで書いてLinuxにアップロードしているのでしたら、その時の漢字コードの指定は何にしているのか提示してください。

この回答への補足

返事ありがとうございます。
「データ」という文字は、Emacsにて作成しました。
文字コードは調べてみたところ、iso-2022-jpというものでした。
宜しくお願い致します。

補足日時:2004/03/27 01:53
    • good
    • 1

printf("%c", 'ア');



こんなコードで出してるとか。
最低限printfで問題が出ている個所のソースがないと。

この回答への補足

説明不足で申し訳ございませんでした。
printf("データ");
のようにごく普通に文字列を並べたものであっても文字化けがします。この場合は、文字化けで・抗検璽・・と表示されます。
宜しくお願い致します。

補足日時:2004/03/26 23:01
    • good
    • 0
この回答へのお礼

返事ありがとうございます。

お礼日時:2004/03/28 23:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!