• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語における漢字の取り扱いについて??)

C言語での漢字の取り扱いについて

このQ&Aのポイント
  • C言語でgnuplotを利用してプログラムを書いていますが、文字化けしてうまく表示されません。漢字の取り扱いの問題なのかC言語の問題なのかわかりません。解決策を教えてください。
  • C言語とgnuplotを組み合わせてプログラムを書いていますが、プログラム上で入力された漢字がうまく表示されません。どのようにして解決できるのか教えてください。
  • C言語でgnuplotを使用したプログラムを作成していますが、文字化けの問題が発生しています。漢字の取り扱いやプログラムの設定など、解決策を教えてください。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

詳細はわかりませんが ・PNGは、画素全部の色情報でできている:座標(X,Y)の色は何、というのが全画素分 最終的な画像をgnuplot側で処理して出力される。 Gnuplotとの文字コードが不一致だと、文字化けする。 ・EMFは、図形の情報でできている: 座標(x,y)に○、座標(X,Y)に□、といった感じ 文字列も、テキストそのものがデータとして記録される。 EMFを表示するアプリでの文字コードと一致すれば文字化けしない ということではないか、と。 HTMLで例えるなら、 ・PNGはエンコード不一致状態で文字化けした状態をスクリーンショットで保存したもの。 ・EMFはHTMLそのものを保存して、後で正しいエンコーディングでブラウザで見ている状態 とでもいいましょうか。 ○ファイル保存方法 FILE *型 はファイルポインタといって、OSの機能を使って、異る装置に対する入出力を、同じ操作で行うために使われるものです。 _popenはその入出力先としてプログラムを指定します。使い終ったら_pcloseで閉じます。 fopen関数を使うと、入出力先とてファイルを指定できます。使い終ったらfcloseで閉じます。 オープンしてFILE *と結びつければ、その先がプログラムなのかファイルなのかは意識する必要はほとんど無く、例えばfprintfでその出力先へ出力してくれます。 今回の場合なら、_popen→fopenで出力先だけ変えるのが、変更箇所も少なく、元に戻しやすい方法です。 なお、出力先のファイル指定を忘れずに。今のままでは_popenをfopenに変えただけだと、gnuplotの実行ファイルを破壊します。 このあたりの入出力はC言語だけでなく、他言語でも基礎ですので、勉強することをお勧めします。

saterain20
質問者

お礼

ありがとうございます。勉強します

その他の回答 (2)

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.2

文字にも表示するための「番号」が付いてるのは判る? で、その番号ってのは「規格」が色々有ってね。 入力と出力と処理とで規格が合致してないと正しく表示できない。 入力がAという規格の「ファイル」に記述された文字 処理がBという規格の文字を扱って 出力がCという規格・・・ なんて事になったら変換しないといけない Aがインチ、Bが尺、Cがメートル みたいな話。どれも長さなのに。 「文字コード」で調べたら良いんじゃないかな。 使ってる表示と処理が何になってるかって話。 因みにC言語自体は「バイナリ」として扱うから規格自体は何でも関係ないんだけどそれを編集しているエディタの「文字表示」が入出力と異なってると(以下略・・・かなりややこしいからすぐ理解できないとおもう

saterain20
質問者

お礼

ありがとうございます。 文字コードで検索して考えてみます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> pngにおける文字の取り扱いの問題なのかC言語における文字の取り扱いなのかと考えて解決策を考えているのですが、うまくいきません まず、pngはbmp等と同じで、各点の色しか覚えていません。「pngにおける文字の取り扱い」は、ただの「絵」であって、「文字化け」は、その絵を作るときに発生します。 C 言語では、特になにもしなければ、ソースに書いたバイト列がそのまま出力されます。 scanfも受け取ったバイト列そのままです。 文字化けしないようにするには、出力の際に文字コードを変換するか、出力を受けとるソフトの方で変換するか、です。 今回の場合は、Cが出力する文字コードと、Gnuplotが期待する文字コードの不一致が原因でしょう。 Gnuplotの対応は、バージョンやパッチ、ビルド時の設定によって違ってきます。そのため、御自身で調べていただかないとなのですが ・スクリプトで 「set encoding XXX」 と文字コードを変更する ・Cの文字コード変換ライブラリを探すかして、Gnuplotが求めるコードで出力する といったことが必要です。 また、直接_popenでgnuplotに送らず、一旦ファイルに書き出せば、期待通りのスクリプトがgnuplotに送られているかの確認もできるし、いちいちCのコンパイル→実行をしなくても、スクリプト変更による動作の確認ができます

saterain20
質問者

お礼

ありがとうございます。 >直接_popenでgnuplotに送らず、一旦ファイルに書き出せば、期待通りのスクリプトがgnuplotに送られているかの確認もできるし、いちいちCのコンパイル→実行をしなくても、スクリプト変更による動作の確認ができます。 この部分を自分で行おうとしているのですが、具体的なやり方がわかりません。 よろしければ、教えていただけないでしょうか? よろしくお願いいたします。

saterain20
質問者

補足

#include<iostream> #include<cstdio> #include<stdio.h> using namespace std; #define GNUPLOT_PATH "C:/gnuplot/gnuplot/binary/gnuplot.exe" int main() { FILE *gp; char s[100]; //scanf("%s", s); gp = _popen(GNUPLOT_PATH, "w"); if (gp == NULL) { fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); } // gnuplotにコマンドを送る //fprintf(gp, "set terminal png\n"); fprintf(gp, "set terminal emf color 'Ryumin-Light-EUC-H' 16\n"); fprintf(gp, "set output 'plot_sample.emf'\n"); fprintf(gp, "set title 'ううう'\n"); //fprintf(gp, "set title '%s' font 'MS明朝", s); fprintf(gp, "set xrange [-pi:pi]\n"); fprintf(gp, "plot sin(x), (x+1)*x*(x-1)\n"); fflush(gp); // バッファに格納されているデータを吐き出す(必須) //getchar(); // 入力待ち _pclose(gp); exit(EXIT_SUCCESS); } プログラムを上記のように変更しました。ファイル形式をpngからemfに変換しています。すると文字化けされずに表記されました。 しかし、うまくいった理由がわかりません。できれば別の形式で保存したいのですが。うまくいった理由や他の手法があれば教えていただけないでしょうか?よろしくお願いいたします。

関連するQ&A

専門家に質問してみよう