初歩から始める初心者向けPerl-CGI講座 ■
|
| トップページ | CGI設置 | CGI作成 | 作成事例 | 設置用語 | 作成用語 | 関数リファレンス | FAQ | お問合せ | |
|
HTMLページを表示する際のヒント |
CGI 作成の初歩でもあるように、CGI からHTMLページを書き出せます。
しかし、そのまま書き出すと文字化けしたり思ったような表示にならなかったり
する場合もありますので、それらを説明していきます。
表 や 能 など直接表示しようとすると文字化け・エラーを起こすものがある
通常のHTMLページと違い、CGI からページを書き出す場合は文字化けする文字があります。 例えば
表 や 能 などの漢字でカタカナでも文字化けするものがあります。 これらは特殊な意味を持つ \ 記号のコードを含む為で下のような処理で回避できます。
文字化けしてしまう例
print "表示してみる";
|
文字化けを回避した例
print "表\示してみる";
|
上記のれいでは 表 が最後に来ていないので文字化けするだけですが、上記の例で表という文字
が最後に来ていた場合、文字化けではなくサーバエラーとなりますのでご注意下さい。
表などの文字は2バイト目に \ 記号を表すコードが入っていますので、その次の文字がエスケープ
されてしまい(下の例では " がエスケープされてしまう)結果サーバエラーとなります。
print "綺麗な表";
また、このような文字以外の場合に文字化けしてしまう場合は、ブラウザが文字コードを正しく認識
していない為に起こる場合がありますので、下のように文字コードを指定します。
ブラウザの文字コード判別はページ先頭の方の文字を見て判断しますので、ページ最初が英語など
で始まっている場合、文字化けする可能性がありますので、下のように指定しておきましょう。
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
文字化けしてしまう例
print <<"HTML";
Content-type: text/html\n\n
welcome
こんにちわ!
HTML
}
|
文字化けを回避した例
print <<"HTML";
Content-type: text/html\n\n
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
welcome
こんにちわ!
HTML
} |
メールアドレスの @ マークや $記号などが正しく表示されない
これも、内部でそれらの記号が 配列 や スカラー変数 として扱われる決まりになっている為で、
そのままメールアドレスを表示しようとすると、 aaa@aaa.com の @マーク以降が配列だと認識
する為、正しく表示されません。
この場合も \ 記号を付けてエスケープする事で正しく表示する事ができます。
上手くいかない例
print "aaa@aaa.com";
|
回避した例
print "aaa\@aaa.com";
|
ブラウザで表示したページのソースを見てみると全部つながっている
CGI のソース内で【Enter】キーを押して改行しても、実際には改行されていません。
HTMLページで改行する時は <BR>タグを利用し、ソース内で改行したい時は改行
コードの \n を使います。
ソースが全部つながってしまう例
print <<"HTML";
Content-type: text/html\n\n <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
HTML
}
|
ソース内にも改行を入れた例
print <<"HTML";
Content-type: text/html\n\n
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
あいうえお\n
かきくけこ\n
さしすせそ\n
たちつてと\n
なにぬねの\n
はひふへほ\n
HTML
} |
CGI から生成したHTMLページをブラウザで表示させ、【ソースの表示】 をすると、改行
コードを入れていない場合はつながっていますが、動作には全く問題ありません。
HTMLページを書き出そうとすると、なぜかエラーとなってしまう
配列や変数を表す @ 記号や $ 記号と同様に、ページ書き出しを行う際には "
や ' にも注意
が必要で、特にHTMLページで値を囲う場合も " など使用しますので、これらもエスケープ
する必要があります。
エスケープする必要があるのは、 print "文字列"; で出力する場合のみで、上記
その3 の
ように全体を出力する場合はエスケープする必要はありません。
上手くいかない例
print "<img src="aaa.jpg">";
|
回避した例
print "<img src=\"aaa.jpg\">";
|
スクリプト内の書式は結構気を使いますが、このようにHTMLページなどの出力は見落としがちです。
多くの部分を触ってからエラーとなると面倒ですから、少しづつ動作確認しながら作成など行いましょう。
|
|
|
関連項目
・ CGIの作成に関する用語
・ CGI作成に関するFAQ
|
|
Beginner's CGI - Copyright (C) 2003 aimix. All Rights Reserved - |