• ベストアンサー

Perlで長音

無謀なのかもしれませんが、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

  • Perl
  • 回答数3
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.1

いえいえ、全く無謀なんかではないですよ。 おそらく文字コードはSJISで処理してらっしゃるんでしょう。 「日本語は2バイト」というのはご理解いただけるでしょうか? 「ー」という文字は、後ろ1バイトが他の1バイトの文字と同じ文字コードなので、 1バイトずつ処理した時に文字化けが発生してしまいます。 回避方法としては「ヤフー\」としてみるとか、文字コードをEUCにしてしまうという方法があるかと思います。 以前にも類似した質問がありましたので、参考URLに載せておきますね。 下記URLでも日本語の取り扱いについて書かれています。 文字コードの呪い http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/faq/faq2.html#c4 日本語を扱う http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP

参考URL:
http://www.okweb.ne.jp/kotaeru.php3?q=251813
neo_gigantes
質問者

お礼

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

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

> <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($&); とすれば問題解決です。(確認済み)

neo_gigantes
質問者

お礼

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

  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.2

処理や表示をする時に、ここはSJISだけどこっちはEUC…なんて、文字コードが混ざらない限り大丈夫なはずです。 それから表示する場合は、念のためContent-TypeといっしょにCharsetも書いて、明示的に「これはEUCで書かれています」としておくとブラウザで表示した時に文字化けが! という事が避けられると思います。

neo_gigantes
質問者

お礼

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

関連するQ&A

  • フレームページを一定「量」だけ横移動

    http://studio-p.net/ こちらのようにインラインフレームを横移動させるようなスクリプトを実行させたいのですが、改造のしかたが分からず、一度HPを丸ごとDLしてローカルで試してみようとしたんですが、何も手を加えない状態でスクリプトエラーと出てしまいました。 仕方ないのでことスクリプトを使うやり方は諦めたので、ここで似たようなスクリプトをお尋ねしたいと思います。 僕が横移動させたいページをいうのはCGI形式の掲示板なので、各ポイントに<a name="xxx"></a>、<a href="#xxx">というようなタグを自動で打ち込ませることはできません(出来るとしたらやり方が分かりません)。 なので、リンクをクリックすると一定量(たとえば400ピクセル)だけ左右に移動するような、そのようなスクリプトがあれば解決すると思います。 例に挙げたページではアニメーションっぽい動きがついていますが、これは無くても構いません(あると助かります)。 もう1つ質問なのですが、これらのスクリプトに著作権ってあるのでしょうか? 例に挙げたページのようなスクリプトって他で見たことが無いので、管理人さんの自作のものだと思うのですが、そういうものはやはりその人が苦労してプログラムしたものだけに、無断で流用・改造して使ったら問題になるのでしょうか? よろしくお願いします。

  • Perlの正規表現でマッチする範囲を限定

    例えば、以下のようなことがしたいのですが可能でしょうか? 変数$bufに複数行の文字列が入っていたとしてこのうち、 タグとエレメント外を対象にしてマッチさせる (例として以下のような文字列にしたい) <a href="abcdef">abcdef</a><br> <b>abc</b>defabcdef<br> abcdef<b>abcdef</b><br> ↓(タグとエレメント外の文字aを<b>a</b>に置き換える) <a href="abcdef">abcdef</a><br> <b>abc</b>def<b>a</b>bcdef<br> <b>a</b>bcdef<b>abcdef</b><br> 実際にはこのときのマッチの対象となる文字と文字数は可変で bになるかもしれないですしabとかになるかもしれません。 ネット上で検索していろいろ試してみたのですが惜しい ところまではいっても完全に正しく動作しませんでした。 (タグやエレメントの中身に反応してしまったり一部分が 置き換えされなかったり<br>タグの後ろが<b></b>のように なったり) 良いアドバイスください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • VBAを使ってHTMLソースから特定の文字列を抽出したいと思っています

    VBAを使ってHTMLソースから特定の文字列を抽出したいと思っています。 正規表現を利用してタグに挟まれた文字を抽出したいのですがうまくいきません。 タグごと抽出する方法でも構わないので教えてください。 例えば <a href="www.yahoo.com△">○○○</a>   ・・・<1> ※△は(www.yahoo.com)+(半角数字1文字) ※○○○は1文字以上の全角文字 このようなパターンの文字列(<1>を丸ごと)を抜き出すには どのような正規表現を書けばよいでしょうか? 単に<a href ではじまって </a>  で終わる文字列であれば <a href.*</a> で良いと思うのですが、もう少し範囲を絞れば目的の文字列だけを抽出できるので ぜひ実現させたいと思っています。宜しくお願いします。

  • 正規表現での複数箇所の文字列置換について

    文字列から特定の文字を検出し、 HTMLタグに置換するスクリプトを作成しようとしています。 例: 元の文字列:xxxxxx[id:1]xxxx[id:2]xxxx  ↓ 置換後の文字列: xxxxxx (<A>タグによるリンク。idが1番のタイトルをDBから参照) xxxx (<A>タグによるリンク。idが2番のタイトルをDBから参照) xxxx 要求している処理順序:  1:文字列中から[id:xxx]を検出して<A>タグに変換  2:id:xxx の xxx部分(数字)を抽出  3:2で得た数字でSQLを実行  4:DBから得た文字列で<A>タグを完成    <A href="test.php?id=(2で得た数字)">(4で得た文字列)</A>  5:以上を[id:xxx]の個数分だけ繰り返し --- スクリプト: // 文字列 $str = "xxxxxx<br>[id:1]<br>xxxx<br>[id:2]<br>xxxx"; // 置換 $result = ereg_replace("\[id:([0-9]+)\]","<a href=\"test.php?id=\\1\">xxx</a>"; ここで、id: の次に続く数字を抽出して その数字を元にDBからデータを引っ張ってこようと思ってます。 // 抽出 $pregresult = preg_match("/[0-9]+/",$result,$match); $id = $match[0]; ここで $id に番号が入り、その番号でSQL文を作成したいのですが 文字列中に[id:xxx]がひとつだけなら正常に動作するのですが 二つ以上存在する場合、$id には最初に検出された数字(上記例では 1 ) しか入ってこないので、二つ目以降のidが認識できず困ってます。 複数の検出・置換対象を順次処理していく方法があれば ご教示いただければ幸いです。 もしくは、他にもっとスマートな方法があるのであれば ご提示いただければ幸いです。 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Perlでの検索

    はじめまして。 Perlにて、テキストから "xxxx ∧ xxx ∨ xxx" という形の文字列を検索しようと思っており、 whileやifなどで while(またはif)($hoge =~ /xxxx ∧/g){... という検索をしても文字列一致しません。 どうやら∧や∨という記号の文字を認識していない ようなのですが、どのように解決すればよいのでしょうか? もしかしたらJ-Codeなどを使って、文字コードを 変えなければならなかったりするのでしょうか? お返事お待ちしております。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • HTMLからPerlを呼び出すには?

    今、Perlで他のサイトのtxtファイル(中身はliタグやaタグのHTMLファイルで、そのサイトではSSIで呼び出されています)を、入手して表示させるプログラムを作っています。 これを、呼び出して、あたかも私のサイトのように見せるにはどうすればよいでしょうか? 現在はiframeを使ってそのままtxtファイルのアドレスを指定しているのですが、拡張子がtxtであるため、IEでしか見れないという不具合があります。 これを解決するために、とほほさんのwww入門 http://tohoho.wakusei.ne.jp/wwwperl2.htm#socket で紹介されているPerlを参考にしました。そのPerlのファイルをブラウザから直接URL指定すれば実行できるようにはなり、txtの中身が表示されるようになったのですが、どのようにHTMLから呼び出せばよいのかわかりません。 やはりSSIで実行するしかないのでしょうか。 javascriptの場合、<script>タグでHTMLに直接スクリプトを記述できますが、Perlでもそのようなことは可能ですか?

    • ベストアンサー
    • HTML
  • Perlでの文字列置換に関して

    Perlでの文字列置換についてうかがいます。 文字列中からHTMLタグを排除しようと思うのですが、 タグ部分のみをうまく指定することができず、困っています。 どうか御知恵をお貸し下さい。

    • ベストアンサー
    • Perl
  • ereg_replaceについて

    ereg_replaceで文字を入れ換えしようとしております。 その際、 <A HREF="http://www.xxx.co.jp/xxx/xxx.cfm?pd=13850" target="_blank">xxx</A> という文字列の頭のタグ開始部分を取ろうと思ってるのですが、URLに?が入ってるものが入れ換えができません。 解決方法など、お分かりになる方おられましたら、ご教授のほうよろしくお願いします。

    • 締切済み
    • PHP
  • perl内にhtmlとjavascriptのタグの埋め込み

    CGIの改造で、ちょっとしたアクセス解析のタグを埋め込もうと思っているのですが、なんどやっても、タグを付け加えると、アップロードしてもうまく表示されなくなってしまいます。以下にそのまま書きますので、アドバイスをおねがいたします。 ■CGIのスクリプト・HTMLに書き出される際には、この部分がページの一番下に表示されます■ print "</small></P></div>\n;</body>\n</html>\n"; exit; ■私が</body>の直前に加えたいスクリプト■ ※リンク先等のURLは一応プライバシーということで、変えております。ご理解ください。 <a target="_top" href="http://t.extreme-dm.com/?abcdefg"> <img src="http://u1.extreme-dm.com/i.gif" height=38 border=0 width=41 alt=""></a><script language="javascript1.2"><!-- EXs=screen;EXw=EXs.width;navigator.appName!="Netscape"? EXb=EXs.colorDepth:EXb=EXs.pixelDepth;//--> </script><script language="javascript"><!-- EXd=document;EXw?"":EXw="na";EXb?"":EXb="na"; EXd.write("<img src=\"http://t0.extreme-dm.com", "/0.gif?tag=ichibaka&j=y&srw="+EXw+"&srb="+EXb+"&", "l="+escape(EXd.referrer)+"\" height=1 width=1>");//--> </script><noscript><img height=1 width=1 alt="" src="http://t0.extreme-dm.com/0.gif?tag"></noscript> 非常に長いですが、extremeTrackingでは、このタグを<body></body>内に埋め込む必要があります。 私は、perlについては非常に疎いもので、 print もしくは、 \n; 等をどうにかして埋め込めばいけるものかと思ったのですが、どうにもうまくいきませんでした。 perlにお詳しい方の助け舟をお待ちしております。 宜しく御願い致します。

    • ベストアンサー
    • CGI
  • AタグでFunctionを実行

    xxx.jsというJavaScript1ファイルのyyy()というFunctionを、Aタグで実行させたくて、 <SCRIPT LANGUAGE="JavaScript" SRC="xxx.js"></SCRIPT> <A Href="JavaScript:yyy(document.all.id,document.all.name);">取込</A> と書いたんですが、オブジェクトがありません。というエラーが出てしまいます。 記述が間違っているんでしょうか?

    • ベストアンサー
    • HTML

専門家に質問してみよう