![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
無謀なのかもしれませんが、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
No.1ベストアンサー
- 回答日時:
いえいえ、全く無謀なんかではないですよ。
おそらく文字コードは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
早速の丁寧で的確なご回答、本当にありがとうございます!
まだ漠然としていますが、だいたい何が問題なのかはわかりました。
参考urlのページも一読してみました。
どうもこの問題を解決するにはeuc-jopで書かなくてはならないとのことで、それが可能なエディタも探して早速インストールしてみました。(Terapadというエディタです)
で、最後にちょっと教えて頂けるとうれしいのですが、
このエディタでeuc-jpで書き直してそのまま使えるものなのでしょうか?(内部でのコード変換は行うとして)
できれば、他のcgiはいじらないで必要な部分だけにとどめておきたいのですが・・・。
お暇でしたらご教授お願い致します。m(_ _)m
No.3
- 回答日時:
> <img src=xxxx>ヤフー<br>
> といった、他のタグでは問題がありません。
んー、おかしいですね。
参考にされたスクリプトをコピーしてテストしたところ、img に関してはエラーが出ましたよ。
@tag に '<img(.*)>'を入れていないのでは?
で、問題の件ですが、別にEUCに変える必要はありませんよ。
yuizuian さんの回答にある参考URLの方で、私も回答しているのですが、これは
「ー」の2バイト目の文字コードが、正規表現のメタタグになっている
ために起きる問題ですので、参考にされたスクリプトの
while ($value =~ /$_/i) {
$srctag = $&; ※
$reptag = $&;
$reptag =~ s/</</g;
$reptag =~ s/>/>/g;
$value =~ s/"/\"/g;
$value =~ s/$srctag/$reptag/g;
}
※の行を、
$srctag = quotemeta($&);
とすれば問題解決です。(確認済み)
アドバイスありがとうございました。お礼が遅くなってすみません。諸般の事情で動作確認するのが遅くなりまして、このほどようやく確認できました。
確かにアドバイス頂いた方法でエラーになることなく、長音を含んだ文字でも表示されました!
しかし、何故か他をいじっているうちに再現できなくなってしまって・・・・。
とにかく一度は確認できましたので、頂いたアドバイスに習って修正したいと思います。本当にありがとうございました。m(_ _)m
No.2
- 回答日時:
処理や表示をする時に、ここはSJISだけどこっちはEUC…なんて、文字コードが混ざらない限り大丈夫なはずです。
それから表示する場合は、念のためContent-TypeといっしょにCharsetも書いて、明示的に「これはEUCで書かれています」としておくとブラウザで表示した時に文字化けが!
という事が避けられると思います。
お礼が遅くなりすみませんでした。
アドバイス頂けて感謝しております。EUCで書いてEUCで表示させるのが一番安全確実のようですね。本当に勉強になりました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI CGIで出力するhtmlの<!DOCTYPE html>等のタグは要りますか? 2 2023/02/05 21:26
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- その他(パソコン・周辺機器) チャレンジタッチ3 改造 アプリインストールできない 1 2022/07/01 14:43
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォームから送られてきた文字...
-
何時間後を求める。
-
例外処理のフローチャートの記...
-
ユーザー定義関数に#NAME?が返...
-
モジュールとクラスの違いって...
-
「デバイスは PRN を初期化でき...
-
エクセルVBAでシートモジュール...
-
現在アクティブなフォーム名を...
-
VBAでoutlook365が起動しません。
-
VBSがコンパイルエラーになりま...
-
VBAで旧字体を異字体に一括で変...
-
VBAのバージョン管理
-
モジュールとは何ですか
-
NET::POP3の代用できるスクリプト
-
perlスクリプトのブラウザURLか...
-
モジュールからフォームのボタ...
-
【vba】フォームに書いてあ...
-
Pythonプログラミングでエラー
-
LCD ディスプレイを Raspberry ...
-
クラスモジュールについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラー
-
XML::XPathで日本語検索するには
-
perlスクリプト s/^\\s+//; ...
-
PerlでIPアドレスを取得する方法
-
「CGIプログラムエラー」って何...
-
perl+shiftjisで5c文字化けの対...
-
実行時パラメータを使用するとE...
-
正規表現でのエラー
-
フォームから送られてきた文字...
-
何時間後を求める。
-
windowsXP上で動作する最新版の...
-
UTF8でperlスクリプトを書くと...
-
ActivePerl 1行入力で 'と"が...
-
Perl 教えてください。
-
メールフォームから大きめの添...
-
perlでactive directoryに登録
-
ローカルテストOKのPerl サー...
-
Perlで長音
-
syntax OKなのに・・・
-
Perlでのルート計算で、小数点...
おすすめ情報