• ベストアンサー

printfで全角カタカナが文字化け?

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

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

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

linuxbeginner
質問者

お礼

返事ありがとうございます。 >> nkf -e  ソースファイル1 > ソースファイル2 このコマンドを実行したあと再コンパイルしてみると、正常に表示されました。EUCに変更できるコマンドがあるんですね。是非、覚えておきます。 >>尚、emacsの左下のところにエディット中のファイの >>漢字コードが表示されるはずです。ソースファイル >>1の場合はEEJ、ソースファイル2の場合は、EEEと >>表示されるはずです。 この点に関しては、私の環境では、ソースファイル1に関しては、-Jと表示され、ソースファイル2に関しては、 -Eと表示されます。が、特に問題は無いようです。 ご回答ありがとうございました。

linuxbeginner
質問者

補足

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

その他の回答 (5)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.6

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

linuxbeginner
質問者

お礼

何度も丁寧な回答ありがとうございます。 >>この件は、カテゴリをUnix系OSに変えて、質問する >>と良い回答が得られるかも知れません。 そうですね。そうしてみます。 >>尚、直接の回答にはなりませんが、emacsはソースがに >>EUCコードの漢字を含んでいれば、EUCコードで入力で >>きるようになりますので、新規のプログラムを作る場 >>合でも、前のソース(EUC漢字を含んだ)をコピーし >>て、作るようにすれば、EUCコードでの入力ができるに >>なります。 なるほど、このやり方もありますね。変更の仕方が分かるまではこのやり方を使うことにします。 ありがとうございました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

#3です。 >そうだったんんですね。てっきり、printf("データ")のように書くのが普通だと思っていました。 「あんまりごく普通ではありません。」と書きましたが、ちょっと誤解をまねくというかまずい表現でした。 JISでソースを書くのが意図的なら、#3で書いた方法を取るのが普通だと思いますが、1引数だけのprintfが普通でないとは思いません。 シフトJISやJIS(ISO-2022-JP等)をプログラム中で文字列として使うにはいろいろ制約(シフトJISだと\が含まれるとか)があるので、かなり意識してプログラムを書く必要があります。 JISコードである必然性が無いなら#4の書かれたようにEUC-JPにするのが楽です。プログラムの出力がJISである必要があるなら、ソースはEUC-JPで書いておいて program | nkf -j で、JISに変換することも出来ますからね。

linuxbeginner
質問者

お礼

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

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

>printf("データ"); のようにごく普通に文字列を並べたものであっても文字化けがします。 あんまりごく普通ではありません。 >文字コードは調べてみたところ、iso-2022-jpというものでした。 iso-2022-jpでの"データ"は、printf の書式制御文字である % を含んでますので、printf の第一パラメータに指定してはいけません。 printf("%s","データ");とか、fputs("データ",stdout); ではどうでしょうか? "データ"に限らず、EUC-JP以外の漢字コードの文字列をprintfの第一パラメータに書かないほうがいいでしょう。fprintfの第二パラメータ等も同じ。

linuxbeginner
質問者

お礼

返事ありがとうございます。 >>iso-2022-jpでの"データ"は、printf の書式制御文で >>ある % を含んでますので、printf の第一パラメーに >>指定してはいけません。 そうだったんんですね。てっきり、printf("データ")のように書くのが普通だと思っていました。 >>printf("%s","データ");とか、fputs("データ >>",stdout); ではどうでしょうか? このようにすると、正常に表示されました。 >>"データ"に限らず、EUC-JP以外の漢字コードの文列 >>をprintfの第一パラメータに書かないほうがいいで >>しょう。fprintfの第二パラメータ等も同じ。 そうですね。次回からは気をつけたいと思います。 ご回答いただきありがとうございました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

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

linuxbeginner
質問者

補足

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

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

printf("%c", 'ア'); こんなコードで出してるとか。 最低限printfで問題が出ている個所のソースがないと。

linuxbeginner
質問者

お礼

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

linuxbeginner
質問者

補足

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

関連するQ&A