電子書籍の厳選無料作品が豊富!

文字「&」を出力したいのにCGI.pmが自動的に「&」に変換してしまいます。

具体的には、
<a href="abc" accesskey="&">abc</a>
のような文字列を出力させるために、
print($q->a({-href => 'abc', -accesskey => '&'}, 'abc'))
というコードを実行したのですが、
出力される文字列は、
<a accesskey="&amp;" href="abc">abc</a>
のように「&」が自動的に「&amp;」に置き換わってしまいます。

これの解決策として、オブジェクトを使用せずに、直接CGI.pmのメソッドを呼び出すと、なぜか変換されません。
すなわち、上のコードの「$q」の部分を「CGI」として、
print(CGI->a({-href => 'abc', -accesskey => '&'}, 'abc'))
とします。

これは何か意味があるのでしょうか。それともただのバグ?
直接CGI.pmのメソッドを呼び出さなくても解決する方法はありますか。

accesskeyに関するご意見は、先日質問したこちらのスレへ頂けるとうれしいです。
http://oshiete1.goo.ne.jp/qa5707867.html

A 回答 (6件)

えぇと, #2 の参考にあげた URL を読んでいただけるとありがたいのですが,


Certain attributes call for a single character from the document character set. These attributes take the %Character type in the DTD.

Single characters may be specified with character references (e.g., "&amp;").
とあります. 最後の 1文を読めば分かるように, 「1文字」であっても文字実体参照を使うことは仕様上可能です.
    • good
    • 0
この回答へのお礼

承知しました。
しかし私の行きつけのチェックサイトでは、実体参照をした場合、1文字と見なしてくれないため、次の4文字は使用しない方針とします。
ダブルクォート(")、アンパサンド(&)、山カッコ(<と>)

お礼日時:2010/03/03 01:20

W3C でも検証ツールは出している (ただしメッセージはすべて英語) ので, そっちでも確認してみてはどうでしょうか. でそっちでしらべると &amp; でも & だけでも通ったりしますが....


いずれにしても, 仕様上は &amp; や &quot; などの文字実体参照を使えないとダメなはずです.

参考URL:http://validator.w3.org/
    • good
    • 0
この回答へのお礼

Tacosanさん、ご返信ありがとうございます。
なんとW3Cのツールでさえ、仕様通りではないのですね!

1.&はHTMLのメタ文字であり属性値としても「&」とせず「&amp;」としなければならない
2.accesskey属性は1文字でなければならない

この2点を考慮すると、
accesskey="&"
は1に違反し、
accesskey="&amp;"
は2に違反するため、
どちらも不正解に思えてきました。

ここは無難に&は使わない方がいいかなぁ?

お礼日時:2010/03/02 16:06

えぇと,


Authors should use "&amp;" (ASCII decimal 38) instead of "&" to avoid confusion with the beginning of a character reference (entity reference open delimiter). Authors should also use "&amp;" in attribute values since character references are allowed within CDATA attribute values.
とあるので「& だけにする」のはアウトではないかと>#3.
まあ, & だけでも「てきと~に解釈してくれる」ユーザエージェントが多いかもしれないけど, should が使われている以上「ダメ」といわれても文句は言えない.

参考URL:http://www.w3.org/TR/html401/charset.html#h-5.3.2
    • good
    • 0
この回答へのお礼

まとめてのお礼でお許しを!
お2人の助言から、私としても、
accesskey="&amp;"
とするのが、正解だと思いました。

そういうわけで、私の行きつけのチェックサイトがバグっている疑いが出てきました。
何とかしてサイト作成者とコンタクトしてみます。
今後も利用したいので。

お礼日時:2010/03/02 14:42

どちらも正しい


&amp;
 ^^^^^一文字でないで、エラーがカウントされている。以後のチェックはスキップされている。

よって、CGI.pmは修正している。
なお、accesskeyに&を使うと、キー操作はAlt + Shift + 6 になるけど・・・
    • good
    • 0

ORUKA1951さんではありませんが仕様上は


<a href="abc" accesskey="&amp;">abc</a>
が正解.

参考URL:http://www.w3.org/TR/html401/types.html#type-cha …
    • good
    • 0

いやはやあまりにも基本的なところで躓いている。


【引用】____________ここから
また、著者は、「&」の代わりに「&amp;」(ASCII十進38)を用い、文字参照の冒頭――文字実体参照の開始区切り子――と誤解されるのを避けるべきである。 CDATA型の属性値には文字参照が出現できるので、著者は属性値においても「&amp;」を用いる必要がある。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ここまで[5.3.2 文字実体参照( http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html4 … )]より
 HTML内には決してそのままでは記述できない文字があります。
# 「&lt;」は < 記号を表現する。
# 「&gt;」は > 記号を表現する。
# 「&amp;」は & 記号を表現する。
# 「&quot;」は " 記号を表現する。
 は、書けない。これらの文字は、HTML内でマークアップするために使われるため、必ず数値文字参照、あるいは文字実態参照で記述しなければなりません。
はじめてのWebドキュメントづくり「HTML化する文章と文字」 ( http://www.asahi-net.or.jp/%7Esd5a-ucd/www/chars … )

 CGIを使うためには、最低限これらのことは知っておかないと無理ですよ。
    • good
    • 0
この回答へのお礼

こんにちは。

なぜ、このような質問をしたいかというと、
私の行きつけの構文チェックサイト(http://openlab.ring.gr.jp/k16/htmllint/htmllintl …)では、
<a href="abc" accesskey="&amp;">abc</a>
と書くと、
<A> の ACCESSKEY の属性値 `&amp;` は正しくありません。ASCII1文字でなければなりません。
というエラーになってしまうためです。

W3Cでは、「属性値においても「&amp;」を用いる必要がある」としているのですね。
しかし、このチェックサイトでは、
<a href="abc" accesskey="&">abc</a>
と書いても、エラーになりません。

ORUKA1951さんは、
<a href="abc" accesskey="&">abc</a>
<a href="abc" accesskey="&amp;">abc</a>
この2つの書き方のうち、正しいのはどちらだとお考えですか。
はたまた、どちらも不正解ですか。

お礼日時:2010/03/02 12:50

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