• 締切済み

文字化け

CGIで旅の検索の画面を作っています。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> int main(void){ time_t timer; struct tm *t_st; FILE * fp fp=stdout; fprintf(fp,"\n"); time(&time); t_st=localtime(&timer); fprintf(fp,"<HTML>\n"); fprintf(fp,"<head>\n"); fprintf(fp,"<META HTTP-EQUIV="Content-Type"CONTENT="text/html; charset="EUC-JP,us-ascii">\n"); fprintf(fp,"<title>日付テスト</title>\n"); fprintf(fp,"</head>\n");      略 としているんですがソースを見ると <html> <head> <META HTTP-EQUIV="Content-Type"CONTENT="text/html; charset="EUC-JP,us-ascii"> <title> $BF|IU0.000000%H (B</title> </head> となっていて実際クライアント側でブラウザ(インターネットエックスプロ-ラ)でみると 『日付テスト』→『日付握旭旭旭ト』 と表示されます。 いろいろ試したところ全角カタカナの『テ』が『握旭旭旭』となり『ススス』とすると『スス』という感じでスがひとつ表示されなくなります。 この文字化けを直すことはできないでしょうか?? どんなことでも構いませんのでなにか情報をお持ちの方は返信お願いします。

  • CGI
  • 回答数4
  • ありがとう数0

みんなの回答

  • t140
  • ベストアンサー率39% (59/150)
回答No.4

fprintf関数に渡しているのはJISコードですね。 JISコードの『テスト』は、『%F%9%H』となります。 これはprintf関数系のフォーマット指定子ですよね?

回答No.3

コンパイル前のファイルの文字コードがShift_JISになってませんか?

saki05027
質問者

補足

ありがとうございます。 確認してみたました。ちゃんとEUCになっていたんですが・・・。 そこが原因ではないってだけでも前に進めた気がします。 ほかに思い当たる原因があればぜひ教えてください。

回答No.2

charset=の後のダブルクォーテーションは要らないのではないでしょうか。また、us-asciiも要らないのでは? fprintf(fp,"<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=EUC-JP\">\n"); このようになると思います。 それからHTTPヘッダでContent-TypeをEUC-JPとして出力しているかどうかも確認したほうがよいかもしれません。

saki05027
質問者

補足

ありがとうございます。 さっそく試したところページ全体がコードで出力されてしまいます。 タイトル部分『日付テスト』は ←$BF|IU0.000000%...... という具合に変換されて出力されてきました。 HTTPヘッダも確認したのですがEUC-JPになっていました。 何かほかに気になることがあればぜひ教えてください。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.1

とりあえず、試しにエスケープしてみてはどうでしょうか? fprintf(fp,"<title>日付テスト</title>\n"); を以下のように。 fprintf(fp,"<title>\日\付\テ\ス\ト</title>\n");

saki05027
質問者

補足

ありがとうございます。早速下記のとおり試したのですが fprintf(fp,"<title>\日\付\テ\ス\ト</title>\n"); コンパイル時に『警告:unknown escape sequence: '/033'』 とでてコンパイルが通りません。 どうしたらいいでしょうか??

関連するQ&A

  • C言語 初心者です。

    いつもお世話になっています。 以下のソースはファイルに今日の日付を書き込み、それをコマンドプロンプトに表示させたいと思い作成しましたが、できません。 どうか教えてください。 #include <time.h> #include <stdio.h> void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); fp = fopen("time.txt", "w"); int year, month, day; fprintf(fp, "%d%d%d%d\t",local->tm_year + 1900, local->tm_mon + 1, local->tm_day); printf("%d%d%d%d\n", year, month, day); fclose(fp); } int main(void) { put_data(); return 0; }

  • time関数

    time関数で取得した値をファイル名として、任意のディレクトリにファイルを作成したいのですが、実装方法がわかりません お分かりの方、教えていただけませんでしょうか #include<stdio.h> #include <stdlib.h> #include <time.h> #include<sys/types.h> #include<unistd.h> time_t time(time_t *tloc); int main(void){ char keys[16] = "\x00"; time_t t; t = time(&t); printf("%ld\n", t); FILE *fp; fp = fopen(・・・・・ "w");    :     :     : fclose(fp);

  • 時刻取得について

    C言語において時刻取得を以下のようにプログラムしたら、プログラムを3回目以上実行すると前回時間内容が常に1回目が表示されてしまいます。どこを直せばちゃんと前回の時刻が正しく表示されるようになるのでしょうか。put()のfopenの"a"の部分は"w"に変えるだけで正しく実行されるのですが、これを"a"にした場合について正しく表示されるようにするということです。 #include <time.h> #include <stdio.h> void get(void); void put(void); char data_file[] = "time.dat"; int main(void) { get(); put(); return(0); } /* 前回の日付・時刻を読込む   */ void get(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if ((fp = fopen(data_file, "r")) == NULL){ printf("\a本プログラムを実行するのは初めて\n"); }else { int year, month, day, h, m, s; fscanf(fp, "%d %d %d", &h, &m, &s); printf("前回は%d時%d分%d秒\n", h, m, s); fclose(fp); } } /* 今回の日付・時刻を書き込む   */ void put(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); if ((fp = fopen(data_file, "a")) == NULL) printf("\aファイルをオープンできません。\n"); else { printf("現在の日付・時刻を書き出しました。\n"); fprintf(fp, "%d %d %d\n", local->tm_hour, local->tm_min, local->tm_sec ); fclose(fp); } }

  • メールの内容が文字化けします・・・

    <? function sendmail($to,$from,$from_name,$title,$message){ /* EUCコードへのエンコーディング */ $to = mb_convert_encoding($to , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $from = mb_convert_encoding($from , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $title = mb_convert_encoding($title , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); $message = mb_convert_encoding($message , "EUC-JP","EUC-JP,UTF-8,SHIFT-JIS,ASCII,JIS"); /* 改行コード変換(CR+LFへ変換) */ $to = ereg_replace("\r", "", $to); $to = ereg_replace("\n", "\r\n", $to); $from = ereg_replace("\r", "", $from); $from = ereg_replace("\n", "\r\n", $from); $from_name = ereg_replace("\r", "", $from_name); $from_name = ereg_replace("\n", "\r\n", $from_name); $title = ereg_replace("\r", "", $title); $title = ereg_replace("\n", "\r\n", $title); $message = ereg_replace("\r", "", $message); $message = ereg_replace("\n", "\r\n", $message); /* メールヘッダ生成 */ $header = "From: ".$from_name." <".$from.">\n"; $header .= "Reply-To: ".$from_name." <".$from.">\n"; /* メール本文生成 */ $message = mb_convert_kana($message,"KV"); /* 送信メッセージ言語設定 */ mb_language("Japanese"); /* メール送信処理 */ $rcd = mb_send_mail($to,$title,$message,$header); return $rcd; } ?> 何が原因か分からないのです・・・。 教えていただければ嬉しいですm(__)m

    • ベストアンサー
    • PHP
  • open cvで配列の値をテキストに出力するプログラム

    こんにちわ。  今、open cvで映像を読み込みその映像の何フレーム目でキー入力がされたかを出力するプログラムを作成しています。  そこで、キー入力されたキーとその時のフレーム、時間の結果を配列に格納して、その内容をテキストに出力したいのですがうまくいきません。ファイル出力された結果は上書きされて最後に行ったキー入力の結果しか出力されません。全ての結果をテキストに出力できるようにしたいのでお願いします。  いろいろ不具合があると思うので教えてください。 ---------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "cxcore.h" #include "cv.h" #include "image.h" //読み込む動画ファイル名 char* input_filename="video2_result.avi"; //IplImage IplImage* src; IplImage* gray; IplImage* canny; int main(void) { char wname[] = "input"; CvCapture* capture; IplImage *frame; int key; int a[1000]; int count = 0; FILE *fp; time_t timer; struct tm *date; char str[256]; capture = cvCaptureFromFile("video2_result.avi"); cvNamedWindow(wname,1); for(;;){ frame = cvQueryFrame(capture); if(frame == NULL) break; cvShowImage(wname,frame); key = cvWaitKey(30); /*キー入力*/ if(key == 'q') break; if(key == 'a'){ printf("%d\n",count); /*現在時間の取得*/ timer = time(NULL);/* 経過時間を取得 */ date = localtime(&timer);/* 経過時間を時間を表す構造体 date に変換 */ strftime(str, 255, "%Y, %B, %d, %A %p%I:%M:%S", date); printf("%s\n", str); } count++; } cvReleaseCapture( &capture ); cvDestroyAllWindows(); //入力結果をファイルに出力 fp = fopen("frame.txt","w"); { fprintf(fp,"%d,\n",a[count]); fprintf(fp,"%s,\n",str); fprintf(fp,"\r\n"); } fclose(fp); return 0; } --------------------------------------------------- これが作成中のプログラムです。

  • テキストファイルに出力した結果の加算

     キーボードから'a'を入力した時点で'1'をテキストに書き込み、何も入力しない時は'0'を書き込むプログラムを作りました。  このプログラムを改良して、実行するたびに前のテキストの内容に実行結果を足していくようなプログラムを作りたいのですがどのように改良していけばよいでしょうか?  例えば、1回目に入力した時点と2回目に入力した時点がかぶっていたらテキストファイルにはその時点の数値が'2'となるようにしていきたいのです。  プログラムは以下です。 ------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <cxcore.h> #include <highgui.h> #include "cv.h" #include "image.h" #include "avi_w.h" //IplImage IplImage* src; IplImage* gray; IplImage* file; int main(void) { char wname[] = "input"; CvCapture* capture; IplImage *frame=NULL; char* captureWindow = "Capture"; int key; int count; int score[10000][1]; int i; int j=1; int k=0; char filename[256]; FILE *fp,*fq; time_t timer; struct tm *date; char str[1000]; //AVIファイルの読み込み・出力 capture = cvCaptureFromFile("video.avi"); cvNamedWindow(wname,1); frame = cvQueryFrame(capture); //キャプチャサイズを知るために画像取得 //変数群の定義 CvVideoWriter* VideoWriter = NULL; char* file = "movie.avi"; // 出力ファイル名 double fps = 30.0; // ビデオのフレームレート //ビデオファイル書き込みの設定 VideoWriter = cvCreateVideoWriter(file,-1,fps,cvSize(frame->width,frame->height),1); //画像表示ウィンドウの出現位置指定 cvMoveWindow(wname, 300, 300); //ファイルオープン fp = fopen("frame.txt","w"); fprintf(fp,"フレーム\n"); for(count=1;;count++){ frame = cvQueryFrame(capture); cvShowImage(wname,frame); key = cvWaitKey(30); if(frame == NULL) break; /*キー入力*/ else if(key == 'q') break; else if(key == 'a'){ //ビデオファイル書き込み cvWriteFrame(VideoWriter,frame); key = cvWaitKey(1); printf("aが%dフレーム目で入力されました\n",count); /*現在時間の取得*/ timer = time(NULL);/* 経過時間を取得 */ date = localtime(&timer);/* 経過時間を時間を表す構造体 date に変換 */ strftime(str, 255, "%Y, %B, %d, %A %p%I:%M:%S", date); printf("%s\n\n", str); //テキストファイルに出力 fprintf(fp,"[%03d] ",count); fprintf(fp," 1\n"); } else{ fprintf(fp,"[%03d] ",count); fprintf(fp," 0\n"); } } cvReleaseVideoWriter(&VideoWriter); cvReleaseCapture( &capture ); cvDestroyAllWindows(); fclose(fp); return 0; } ----------------------------------------------

  • ファイル

    c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。

  • C言語 Segmentation fault

    program SPROGRAM 17 4 pas104 SIDENTIFIER 43 4 ( SLPAREN 33 4 上記のようなファイルを読みこんで、1行づつ各トークン(programとか17とか)を構造体に格納する関数reader()を作りましたが、これを以下のparser.cで呼びだすと「Segmentation fault(core dumped)」となってしまいます。gdbのrunコマンドでプログラムを実行すると、関数を呼び出す所で Program received signal SIGSEGV, Segmentation fault. 0x0040140f in reader () と表示されました。が,どうすればよいか全然分かりません・・・ どうすれば正しく動作してくれるのか、どなたか教えてください・・・ 以下ソース /*read.c*/ #include "head.h" void reader(void) { fprintf(stdout,"check"); char buf[BUF_LEN]; if (fgets(buf,sizeof(buf),fp) == NULL)/*ここで1行読みこむ*/ {/*いきなりNULLの場合*/ strcpy(t.str, ""); t.num = SEOF; t.line = 1; } else { 省略 } return; } /*parser.c*/ #include "head.h" struct tokenbox t; FILE *fp; int main(int argc, char *argv[]) { if (argc != 2)/*引数チェック*/ { fprintf(stderr,"Usage: (./parser) (file.ts)\n"); return -1; } int len; len = strlen(argv[1]);/*file.ts の長さ取得*/ if((argv[1][len-1] == 's') && (argv[1][len-2] =='t') && (argv[1][len-3] == '.'))/*tsファイルが指定されているかどうか*/ { fp = fopen(argv[1],"r");/*ファイルオープン*/ if (fp == NULL) { fprintf(stderr,"Such ts file is not exist\n"); return -1; } fprintf(stdout,"authenticate ts file!\n");//←これは出力される reader(); //←ここでSegmentation faultと思われる printf("t.str = %s\n", t.str); printf("t.str[0] = %c\n", t.str[0]); printf("t.num = %d\n", t.num); printf("t.line = %d\n", t.line); fclose(fp); return 0; } else { fprintf(stderr,"the file is not ts\n"); return -1; } } ヘッダファイル一部抜粋 /*head.h*/ #include <stdio.h> #include <string.h> #include <stdbool.h> #define BUF_LEN 128 #define TOKEN_LEN 128 struct tokenbox {/*tsファイルの各情報を格納する構造体*/ char str[TOKEN_LEN]; int num; int line; }; extern struct tokenbox t;/*構造体をtと置く*/ extern FILE *fp; /*ファイルポインタ*/

  • 現在日時から、任意の時日時を求めるには

    いつもお世話になっています。 いま、現在時刻を取得し、その日付からみて1日前のAM6時へ設定するという処理を作りたいのですが、思うようにできない状態です。 多分、"time(&timer)"で現在時刻を取得し、localtime関数で構造体へ変換してから、値を変更するのだと思うのですが、その部分の処理がうまくできません。 どうかアドバイスをよろしくお願いします。 #include<stdio.h> #include<time.h> void main(){ /* ----------- [ 変数の宣言 ]*/ int i; int sts; int res; time_t timer; time_t ans; struct tm *t_st; /* 現在時刻を取得 */ time( &timer ); t_st = localtime(&timer); t_st->tm_mday - 1; /* ←"コードは意味を持たない"という警告が発生*/ t_st->tm_hour = 6; timer = mktime(t_st); t_st = localtime(&timer); sprintf("%Y/%m/%d %H:%M", -- 以下略 -- }

  • 表示すると文字化けします

    下記のファイルが表示されると文字化けしてエンコードを修正しないとみれませんなぜでしょうか? 日本語EUCになってしまします。 <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE></TITLE> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> </HEAD> <BODY> <TABLE border="1"> <TBODY> <TR> <TD bgcolor="#ffff00" width="699"><B><FONT size="+2">登録ありがとうございました</FONT></B></TD> </TR> <TR> <TD height="99" width="699"><B>■<A href="http*************************">使いこなすために</A>手順に沿って進んでください</B>→<A href="http**************************">次へ進む</A></TD> </TR> </TBODY> </TABLE> </BODY> </HTML>

    • ベストアンサー
    • HTML

専門家に質問してみよう