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

無謀なのかもしれませんが、Perl3日生(勉強しはじめて3日目)の分際で、フリーのスクリプトを改造しています。

そのスクリプトは検索エンジンなのですが、タグが無効になっていたため、いくつかのサイトを参考にして、指定したタグだけを許可するように改造しました。

しかし、何故か登録する文字列(html)に、長音"ー"が入った時だけエラーとなってしまいます。
Perlでは長音というのは何か特別な働きをするものなのでしょうか?

ソースは以下のページを参考にしてますので、以下のページに書かれているものとほぼ同じです。
http://cuo.press.ne.jp/cgi/b04_1.html

フォームから送信?する文字列が、
<a href=xxx>yahoo</a>
であれば問題ないのですが、
<a href=xxx>ヤフー</a>
とするとエラーになります。

また、不思議なことに、文字列でも
<b>ヤフー</b>
<img src=xxxx>ヤフー<br>
といった、他のタグでは問題がありません。

何故でしょうか?

どなたかお詳しい方、ヒントだけでも結構ですので、
何か思い当たることがございましたら、お教え下さい。
よろしくお願い致します。m(_ _)m

A 回答 (3件)

いえいえ、全く無謀なんかではないですよ。



おそらく文字コードはSJISで処理してらっしゃるんでしょう。
「日本語は2バイト」というのはご理解いただけるでしょうか?
「ー」という文字は、後ろ1バイトが他の1バイトの文字と同じ文字コードなので、
1バイトずつ処理した時に文字化けが発生してしまいます。
回避方法としては「ヤフー\」としてみるとか、文字コードをEUCにしてしまうという方法があるかと思います。

以前にも類似した質問がありましたので、参考URLに載せておきますね。

下記URLでも日本語の取り扱いについて書かれています。

文字コードの呪い
http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/f …

日本語を扱う
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=251813
    • good
    • 0
この回答へのお礼

早速の丁寧で的確なご回答、本当にありがとうございます!
まだ漠然としていますが、だいたい何が問題なのかはわかりました。
参考urlのページも一読してみました。
どうもこの問題を解決するにはeuc-jopで書かなくてはならないとのことで、それが可能なエディタも探して早速インストールしてみました。(Terapadというエディタです)
で、最後にちょっと教えて頂けるとうれしいのですが、
このエディタでeuc-jpで書き直してそのまま使えるものなのでしょうか?(内部でのコード変換は行うとして)
できれば、他のcgiはいじらないで必要な部分だけにとどめておきたいのですが・・・。
お暇でしたらご教授お願い致します。m(_ _)m

お礼日時:2002/04/22 00:44

> <img src=xxxx>ヤフー<br>


> といった、他のタグでは問題がありません。
んー、おかしいですね。
参考にされたスクリプトをコピーしてテストしたところ、img に関してはエラーが出ましたよ。
@tag に '<img(.*)>'を入れていないのでは?

で、問題の件ですが、別にEUCに変える必要はありませんよ。
yuizuian さんの回答にある参考URLの方で、私も回答しているのですが、これは

 「ー」の2バイト目の文字コードが、正規表現のメタタグになっている

ために起きる問題ですので、参考にされたスクリプトの
  while ($value =~ /$_/i) {
    $srctag = $&;      ※
    $reptag = $&;
    $reptag =~ s/&lt;/</g;
    $reptag =~ s/&gt;/>/g;
    $value =~ s/&quot;/\"/g;
    $value =~ s/$srctag/$reptag/g;
  }
※の行を、
    $srctag = quotemeta($&);
とすれば問題解決です。(確認済み)
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。お礼が遅くなってすみません。諸般の事情で動作確認するのが遅くなりまして、このほどようやく確認できました。
確かにアドバイス頂いた方法でエラーになることなく、長音を含んだ文字でも表示されました!
しかし、何故か他をいじっているうちに再現できなくなってしまって・・・・。
とにかく一度は確認できましたので、頂いたアドバイスに習って修正したいと思います。本当にありがとうございました。m(_ _)m

お礼日時:2002/05/07 23:56

処理や表示をする時に、ここはSJISだけどこっちはEUC…なんて、文字コードが混ざらない限り大丈夫なはずです。


それから表示する場合は、念のためContent-TypeといっしょにCharsetも書いて、明示的に「これはEUCで書かれています」としておくとブラウザで表示した時に文字化けが!
という事が避けられると思います。
    • good
    • 0
この回答へのお礼

お礼が遅くなりすみませんでした。
アドバイス頂けて感謝しております。EUCで書いてEUCで表示させるのが一番安全確実のようですね。本当に勉強になりました。ありがとうございます。

お礼日時:2002/05/08 00:00

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