プロが教えるわが家の防犯対策術!

CGI.pmのstart_html()を使用してMETAタグを出力しようとしているのですが、思うように出力できません。
具体的には次の文字列と全く同じものを出力しようとしています。
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
いろいろやってみたのですが、どれも微妙にこれとは違うのです。
どなたか教えてください・・・。
今のところ、これに最も近かったのは、
print($q->start_html(-head => $q->meta({"-http-equiv" => "Content-Type", -content => "text/html; charset=EUC-JP"})));
で、これの出力(METAタグ部分)は、
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
でした。
お尻にスペース1個とスラッシュが付加されてしまいます・・・

A 回答 (4件)

なんでドキュメント見ないんですかね。



-no_xhtml
By default, CGI.pm versions 2.69 and higher emit XHTML
(http://www.w3.org/TR/xhtml1/). The -no_xhtml pragma disables this
feature. Thanks to Michalis Kabrianis <kabrianis@hellug.gr> for this
feature.

If start_html()'s -dtd parameter specifies an HTML 2.0 or 3.2 DTD,
XHTML will automatically be disabled without needing to use this
pragma.


And here's how to create an HTTP-EQUIV <meta> tag:

print start_html(-head=>meta({-http_equiv => 'Content-Type',
-content => 'text/html'}))


以上は
perldoc CGI.pm すれば参照できます。

#!/usr/bin/perl
use strict;
use warnings;

use CGI qw/:standard -no_xhtml/;
my $cgi = new CGI;
#print $cgi->header(-charset=>'euc-jp');

print $cgi->start_html(-title=>'CGI.pm sample',
-lang => 'ja',
-head => meta({-http_equiv => 'Content-Type',
-content => 'text/html; charset=EUC-JP'}));
print $cgi->p(
span({-style=>'font-size: xx-large; color: red;'},
'howdy world!'));
print $cgi->end_html;

出力:
<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja"><head><title>CGI.pm sample</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
<p><span style="font-size: xx-large; color: red;">howdy world!</span></p>
</body>
</html>
    • good
    • 0
この回答へのお礼

sakusaker7さん、ご返信ありがとうございます。
できました!
METAタグは私が目指していたものと全く同じものが出せました!
<!DOCTYPE>のタグも今までと変わりました。
CGI.pmはデフォルトではXHTMLを出力するように出来ているのですね。
さて、なんでドキュメント見ないかというとsakusaker7さんのご想像どおりです。
自分で調べるより誰かに聞いた方が手っ取り早いという私の怠慢です。お許しを!

そんな私からsakusaker7さんに、もう1つ質問したいことがあります。
abrilさんのお礼欄でも、それとなく皆さんに回答を求めたのですが、
CGI.pmがデフォルトでXHTMLを出力する仕様になっているということは、
今後はHTMLでホームページ作りをするよりも、XHTMLを学習した方がよいということでしょうか。
よければご意見をお聞かせください。

お礼日時:2008/03/24 23:15

>さて、なんでドキュメント見ないかというとsakusaker7さんのご想像どおりです。


>自分で調べるより誰かに聞いた方が手っ取り早いという私の怠慢です。お許しを!

perldoc ほげほげ

とすればドキュメントが参照できるというのを知らない人が多いみたいなので
そうなのかなあと思ってただけですがw
英語はちょっと…という場合でも、perldoc.jp あたりをみれば、
マニアックなモジュールでなければ結構日本語に訳されたものがありますよ。

> CGI.pmがデフォルトでXHTMLを出力する仕様になっているということは、
> 今後はHTMLでホームページ作りをするよりも、XHTMLを学習した方がよいということでしょうか。

XHTMLがわかればHTMLはそれよりもゆるい規則なので、まあXHTMLやっとけば無難だろう
という気はします。ただ、XHTML 1.1だと厳しすぎるんじゃないの?
という印象はありますがまあそれはさておき。
#HTML5が決まるとどうなるかはちとあれですが。
    • good
    • 0
この回答へのお礼

sakusaker7さん、ご回答ありがとうございます。
perldoc.jpをお気に入りに登録しました。
perldocは正直全然見る気が出なかったのですが、今度からは、このサイトで自分で調べる努力をします。
きっとここへ来る回数も減らしていけるはずです。

そしてXHTMLについての解説ありがとうございます。
XHTML1.1が厳しいというのは、HTMLよりも規則が多いため、これを覚えて使いこなすのは難儀ということでしょうか。
やっと色んなタグを覚えたのに、また別の仕様を覚えなきゃいけないというのは何とも悔しいですね。
そして、今後ホームページはXHTMLで統一されてゆくのかと思いきや
何と、HTML5なるものがリリースされようとしているのですね!!!
私としては標準が2個もあったら、標準とは呼べないと思うのですが・・・
色々覚えなきゃいけないのでイライラしますね!
しかし我々はまだ、どちらかをチョイスしてホームページを作ることができるので、まだいいですが、
ブラウザーメーカーとしては両方に対応しなきゃいけないのでつらいところですね!

お礼日時:2008/03/27 22:30

おはようございます。

Perl (CGI.pm となれば尚更@Ver に、私が追い付けない)は、
数年程度遠ざかっていますので、ご理解のほどをお願い致します。

先ずは前置きからm(__)m
ある種の CGI.pm での日本語コード設定上の注意。
英語の場合、cgi は私の知る限り成功しますが、日本語を出力する場合の文字コードでは、
もし、CGI.pm のバージョンが 【 3.10 】ならば、過去(現在確認不能:ゴメンなさい)に、
マニュアルに書いてあった HTTP-EQIV meta タグの作成方法を使う場合、
ダブって二回出てしまって、且つ、二度目の方で、charset=ISO-8859-1 となってしまてました(汗)

その為に私が、メモとして書き残していた CGI.pm を使っていた際の、
日本語コードの指定方法を載せて頂きます。
1. header( )にて charset を指定します。
2. start_html( ) にて langとencoding を指定します。
3. charset と encoding に指定するのは、'Shift_JIS', 'euc-jp', 'iso-2022-jp', 'utf-8'のいずれかです。
4. langに指定するのは、'ja' です。
今では、この方法を何処で探して、考えたのかは不明ですm(__)m が、
既に、普通に使われているかと思いますが、如何せん、最近は使っておりませんので。

本題です。質問者様には上記現象は起き得ていないので、
サンプルの一部までしか、書けませんが、参考程度にはなるかと思います。
見ていただければわかりますが、あくまでも簡単なテストサンプルを、作成した時の物です。
私の書き方の、違いは別にして下さいね。昔のを引っ張り出して来ましたから(汗)

[ 上部略 ]
use CGI;
# use CGI use CGI qw/ :standard/;

[ 中略 ]
# Settings

our $CharSet = 'Shift_JIS'; # 'Shift_JIS', 'euc-jp', 'iso-2022-jp', 'utf-8'
our $Lang = 'ja';

[ 中略 ]
# Main

[ 中略 ]
print $q->header( -type => "text/html", -charset => $CharSet , -expires => '+1s'
),

#ここの、'+1s' は、既に思い出せなくなっているほど年月が経ってますのでm(__)m 
#後は、【 print($q->start_html 】の括弧内を、検索するというも一つの手かと。     

[ 以下略 ]

>print($q->start_html(-head => $q->meta({"-http-equiv" => "Content-Type", -content => "text/html; charset=EUC-JP"})));
1行で書くのは長すぎますので(テスト用かな?)今後、質問者様の為にも分けて下さいね。
ここの start_html では、[ meta の部分] は、meta タグを、追加してます(その方が良いですよ)ので、
結果として、スペース1個とスラッシュが必要となります。
表現は異なりますが、Ano.1 の abril 様も書かれておりますが。

質問者様におかれましては、簡単かもしれませんが、一応、
正確性を期す為 URL も、載せさせて頂きます。
http://www.rfs.jp/

#現在補足を頂いても、私情にてほぼ不可能ですので、
#誠に申し訳御座いませんが、その点は何卒ご了承のほどをお願い致します。
    • good
    • 0
この回答へのお礼

eagle-eyedさん、ご返信ありがとうございます。
CGI.pmはRPM版を使用していてperl-CGI-2.81-55というものです。
langとencodingはそのようなタグを知らないので、まだ使うのはやめておきます。
今は日本語を出力したいというよりも、とりあえず、このMETAタグを出したいという感じです。
よって私の環境でも文字化けは多分発生すると思います。
しかし発生したら発生したで、対処法はまたそのとき考えるとします。(それはそれで見てみたいので・・・)
今は、とにかくこのメタタグを出力したいのです。

eagle-eyedさんに教わったやり方だと
Expires: Mon, 24 Mar 2008 13:14:09 GMT
Date: Mon, 24 Mar 2008 13:14:08 GMT
Content-Type: text/html; charset=Shift_JIS
と出力され、タグっぽいものは出力されませんでした。

あとeagle-eyedさんのコード中のourは初めて見ます。
私の持っているパールの全組み込み関数が載っている本にもありませんでした。
myの誤りかな??

私の書いたコードは確かに1行で書くには長めですね。
しかし私は1行で書けるものはなるべく1行で書くという、端から見ると何とも意味不明なこだわりを持っています^^
コメントもほとんど書かないしメンテナンス性は最悪です・・・

お礼日時:2008/03/24 22:29

CGI.pmについては馴染みが薄いのですが、もしかして生成されるHTMLファイルがディフォルトでXHTMLになっているのではないでしょうか?


<meta>タグの様な、閉じタグとセットになっていないタグについては、XHTMLの文法上、<meta(省略) />という様に、最後にスペース+スラッシュを入れて記述しなければなりません。
なので、もしXHTMLとして生成されているのであれば、現状で正しい事になりますが。
    • good
    • 0
この回答へのお礼

abrilさん、ご返信ありがとうございます。
XHTMLなるものについて少し調べました。
abrilさんの助言どおりXHTMLでは閉じタグのないタグは最後に/を書く規則になっていました!!
だとすると、このstart_htmlは正しいXHTMLを返していることになりますね・・・
そしてCGI.pmはHTMLではなくXHTMLを出力するためのモジュールなのか!??
abrilさんは残念ながらCGI.pmには馴染みが薄いということですので他の方からのご回答を引き続き大募集です。

恥ずかしながらXHTMLなんて単語は初耳でした。
今後HTMLは廃止され各社のブラウザーがXHTMLを読むように改修されていくのであれば、HTMLでホームページを作るのは中断してXHTMLを学習したいと思いました。
そうすれば、このCGI.pmも問題なく使い続けることができますしね。

お礼日時:2008/03/23 22:51

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