検索CGIを作成しているのですが、検索文字に「ー」(-ハイフンではありません。日本語入力の言葉を伸ばすやつです。”サーバ”とか。)が入った文字を指定し、POSTするとServerErrorになってしまいます。サーバはレンタルものなので原因が分からず途方にくれています。どなたかPerlに詳しい方、ぜひよいアドバイスを下さい。ちなみに処理は下記のように行っています。

(1)検索する元のデータはsjisである。
 ↓
(2)ブラウザのフォームから、検索したいデータがsjisでPOSTされる。
 ↓
(3)ReadParseにてデータを変数へ取り込む。(cgi-lib.pl使用)
 ↓
(4)CGIにて、POSTされたデータをeucへ変換。(jcode.pl使用)
 ↓
(5)検索する元のデータが入ったファイルをオープン。
 ↓
(6)ファイルから1行づつ読み込み変数へ格納。
 ↓
(7)変数へ格納したデータをeucへ変換。
 ↓
(8)if (${POSTされたデータ} =~ /${ファイルから読み込んだデータ}/)といった形でマッチング処理
 ↓
(9)ファイルをクローズし、マッチングしたデータをsjisで結果表示。

※まだデバッグ途中なのですが、とりあえず今判明しているのは
『インターネット』などというふうに、『ー』がキーに入るとエラーになります。

どなたかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

2バイトの文字を1バイトずつ処理する時にエラーが出るのですね。


方法としては#1の方のおっしゃる通り、EUCで扱うのが一番良いのではないでしょうか。
日本語ってやっかいです(^^;
文字コードについて詳しく載っているサイトを2つほどご紹介しておきますね。

参考URL:http://www.mirai.ne.jp/~mikeneko/yuibot/yuibot/f …
    • good
    • 0
この回答へのお礼

参考URLで、私にとってBlackBoxであった文字コードについての理解が深まりました。ありがとうございます。確かにEUCで全て記述することによって、一発解決致しました。

お礼日時:2002/04/27 13:59

EUCへ変換、と書かれていますが、きちんと変換されていないのではないでしょうか。


シフトJISの「ー」の文字コードは「0x815B」となっていますが、この2バイト目のコード「0x5B」は「 [ 」の文字コードであり、これは正規表現のメタ文字です。
このためマッチングを行うと、正規表現が正しく書かれていないというエラーになります。

これを回避するためには、quotemeta関数を使います。
この関数を使用することで、メタ文字などは全てエスケープされます。
使い方は、次のような感じです。
  $word = quotemeta($word);
普通、マッチングに使うデータは、この関数を通します。

ちなみに(8)の部分は、POSTデータと読込データが逆ではないですか?
通常は、
  if (被検索文 =~ /検索語/) {
となると思うのですが。
    • good
    • 0
この回答へのお礼

なるほど、quotemetaなんて関数があったのですね。素人ですみません。
皆様からのいろいろなアドバイスを受け、試行錯誤した結果、全ソース、
及びデータもEUCにすることで解決致しました。でもまだ試してはいないの
ですが、quotemetaを使用したロジックでもうまくいきそうな気がします。
ご助言誠にありがとうございました。

お礼日時:2002/04/27 13:51

大文字小文字の判別や正規表現である必要がなければ、(4)と(7)の処理をなくして、(8)をindex関数を使ったサーチにしてみてください。

ほとんどの場合うまくいきますし、高速です。

以下、簡単なサンプルです。
------------------------------------------------
$data = 'インターネットサービスプロバイダ';
$words = 'ー';

if (index($data, $words) > -1) {
print '検索文字列「', $words, '」が見つかった';
} else {
print '検索文字列「', $words, '」は見つからない';
}
    • good
    • 0
この回答へのお礼

う~ん、index関数も試してみました。ですが、なんだかうまくいかないんですよ~。レンタルサーバなので、なかなかデバッグ情報が得られなくって・・・。
結果、全てをEUCにすることで対処致しました。
貴重なご助言、本当にありがとうございました。

お礼日時:2002/04/27 13:56

EUCにしてください。

    • good
    • 0
この回答へのお礼

おっしゃる通りです。

お礼日時:2002/04/27 14:00

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルでマッチングが上手く行きません

エクセル2007を使っています。

マッチングをしても「0」としか表示されません。
何が原因でしょうか?

マッチングに使うマスターは、同じブック内にあります。
他の作業でも使っているマッチング用の式を修正して使用しています。

マッチングは、全て数値です。

Aベストアンサー

マッチングって何のことですか?MATCH関数?

Qperlの環境変数 ENV{'REMOTE_ADDR'}  について

ショッピングカートのCGIにおいて

ENV{'REMOTE_ADDR'}

IPアドレスを取得すると思うのですが・・・。

何が原因なのかわかりませんが、違うIPアドレスのユーザー同士が、同じIPアドレスを取得したことになり、ショッピングカートの中が重複してしまいます

具体的に、お買物途中で注文したものを削除しないで注文をやめたお客様と同じIPアドレスのもつ他のお客様が買い物かごボタンを押すことにより、

後者のお客様が、ボタンを押していない商品もショッピングカートに入ってしまい・・・。

クレームが入ってしまいます

私ですが、perlに関して素人です。ですが、フリーのCGIを少し加工して使っております。

そこで、質問なのですが、ウイルスバスター等のセキュリティーソフトをインストールしていると、アクセス時に偽装のIPアドレスをログに残す可能性などあるのでしょうか?

勝手な解釈なのですが・・・。

それ以外に、IPアドレスが重複してしまう可能性が自分の知識の範囲内では、思いつきません。

素人的な考えかもしれませんが、ご教授お願い致します

ショッピングカートのCGIにおいて

ENV{'REMOTE_ADDR'}

IPアドレスを取得すると思うのですが・・・。

何が原因なのかわかりませんが、違うIPアドレスのユーザー同士が、同じIPアドレスを取得したことになり、ショッピングカートの中が重複してしまいます

具体的に、お買物途中で注文したものを削除しないで注文をやめたお客様と同じIPアドレスのもつ他のお客様が買い物かごボタンを押すことにより、

後者のお客様が、ボタンを押していない商品もショッピングカートに入ってしまい・・・。
...続きを読む

Aベストアンサー

>ショッピングカートにもIPアドレス認識タイプとCookie利用のタイプがあると思うのですが・・。

調べてみたらあるようですが
http://www.hal9800.com/home/cgi.html
IPアドレスによりきちんとした識別が出来ないため
弊害が起こりうることが明記されています。

>ユーザー自身がクッキーをOFFにしている場合、CGIが使えなくなってしまう
・サイトにクッキーを有効にしてくださいと記述する
・toppageでクッキーを発行し、買い物ページで、そのクッキーを保持しているかどうか判断して
保持していない場合「クッキーが有効でない場合買い物できません」と強調表示する
・クッキー以外の方法ではIDを発行して、QUERYなどでIDを保持させる

>私自身がアクセスしたい際にも、実際のIPアドレスではなく、架空のIPアドレスを2種類、、
これは良くわかりませんがENV{'REMOTE_ADDR'} だけでなく
$ENV{'SERVER_ADDR'} や他の環境変数も記録していませんか?
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2048321
の#2に書いた 環境変数一覧CGIを設置してアクセスしてみて確認してみてはいかがでしょうか?

>ショッピングカートにもIPアドレス認識タイプとCookie利用のタイプがあると思うのですが・・。

調べてみたらあるようですが
http://www.hal9800.com/home/cgi.html
IPアドレスによりきちんとした識別が出来ないため
弊害が起こりうることが明記されています。

>ユーザー自身がクッキーをOFFにしている場合、CGIが使えなくなってしまう
・サイトにクッキーを有効にしてくださいと記述する
・toppageでクッキーを発行し、買い物ページで、そのクッキーを保持しているかどうか判断して
保持し...続きを読む

Qマッチングヘッドについて

こんにちわ!ふと気づいたことがあるので質問させてください!!

ギターのヘッド部分の「マッチングヘッド」に関する質問です!

マッチングヘッドっていうのは、よく
「ローズ指板にはだいたいマッチングヘッド」
というイメージがあります。
マッチングヘッドではなく、何か茶色い塗装をしているものもありますよね?

●メイプル指板ではヘッドの部分はナチュラルがほとんどなのに、なぜローズ指板やエボニーではマッチングヘッドや何かしら塗装していることがが多いのでしょうか?

見た目重視ですかね?

●もしメイプル指板にマッチングヘッドのモデルなんかがあったら皆さんどう思いますか?


一体こいつ何が聞きたいんだよって感じですよねf^^;
●の部分を応えていただけると幸いです。

もし何か説明不足なところがあれば申し訳ありません。
よろしくお願いします!

Aベストアンサー

主にストラトタイプのボルトオンネックのコンポ前提に回答します。

>見た目重視ですかね?
メイプル指板の場合、高級品ではトラ杢、玉杢など杢目の美しい物が使われますから、マッチングにして塗ってしまうのはもったいないということが考えられます。

ローズ指板の場合、それほど杢目が派手なメイプルが使われないので、マッチングで杢目の不味いところを隠してしまうという、ボディのサンバーストと同じような塗装技術の現れかも知れません。

>メイプル指板にマッチングヘッド
私の所有するコンポは、トラ杢メイプルですがマッチングヘッドに敢えて塗装してもらいました。こうするとギター全体が引き締まって見えます。下記画像参照。

Qutf-8のマシンでsjisのデータファイルを読込み、eucでファイルに出力する方法

utf-8のLinuxマシンで、sjis(改行コードCR+LF)のデータファイルを読込み、euc-jp(改行コードLF)でファイルに出力したいのですが、どのようにすればよいでしょうか。プログラム実行前後に入出力ファイルを直接コード変換することは考えておらず、全て一つのプログラム内でやりたいと考えています。
&jcode'convertで変換するのかなと思っているのですが、読込み時・書き込み時のどちらでやるべきなのか、あるいは両方やるべきなのか分かりません。データには、「・」「I,II」などの特殊文字(?)が含まれているので、それらの文字で問題が起きないかなどもちょっと心配です。

また、&jcode'convertでeucに変換すれば、改行コードも一緒にCR+LFからLFに変換されるものでしょうか。
文字コードのことがよく分かっていないので、的外れな質問になっているかもしれませんが、ご教示願います。

Aベストアンサー

perl プログラムを UTF-8 で書くなど、
内部コードを UTF-8 とするなら、入力時に UTF-8 に変換し、
出力時には UTF-8 から外部コードに変換することになります。

jcode'convert で変換してもよいですが、
Encode モジュールを使って明示的に変換するなら
use utf8;
use Encode;
while( my $line = <> ) {
$line =~ s/\x0D\x0A$//xms;
my $utf8_line = decode('CP932', $line);
# anything to do
print encode('EUC-JP', $utf8_line), "\n";
}
みたいな感じだし、PerlIO による自動変換を行うのなら
use utf8;
binmode STDOUT, ":encoding(EUC-JP)";
binmode STDIN, ":encoding(CP932)";
while(my $line = <>) {
$line =~ s/\x0D\x0A$//xms;
# anything to do
print $line, "\n";
}
みたいな感じです。

文字コードの変換と改行コードの変換は別物なので上の例や
jcode'convert では改行コードは自動的には変換されません。

なお jcode'convert はかなり古い書き方になるため、使用されている
jcode.pl は UTF-8 には対応していないかもしれません。
Jcode::convert(Jcode.pm) または Encode を使用された方が
よいと思います。

また、中黒「・」やローマ数字「I」、「II」などでは問題は起きませんが、
外字である「かっこ株」や「まる1」などは正しく変換されません。

perl プログラムを UTF-8 で書くなど、
内部コードを UTF-8 とするなら、入力時に UTF-8 に変換し、
出力時には UTF-8 から外部コードに変換することになります。

jcode'convert で変換してもよいですが、
Encode モジュールを使って明示的に変換するなら
use utf8;
use Encode;
while( my $line = <> ) {
$line =~ s/\x0D\x0A$//xms;
my $utf8_line = decode('CP932', $line);
# anything to do
print encode('EUC-JP', $utf8_line), "\n";
}
みたいな感じだし、PerlIO による自動変換を...続きを読む

Qマッチングトランスのインピーダンス

マッチングトランスを使うと、巻き線比の2乗の割合でインピーダンスマッチングができると言うのは分かるのですが、その時のトランスのインピーダンスは考えなくて良いのでしょうか?
仮に巻き線比では、1次側と2次側の回路のインピーダンスがマッチングしていたとしても、トランスのインピーダンスがそれぞれ接続されている回路とマッチングしていないと意味が無いと思ったのですが、実際のところどうなんでしょう?

Aベストアンサー

トランス自身のインピーダンスは通常無視してよろしいです 無いも同じ
繋がれる負荷叉は駆動側のインピーダンスで決まるのです 但し帯域内で

トランスの負荷に抵抗Rを繋げばトランスの入力インピーダンスは巻き数比の二乗に比例するのはご存知の通り

駆動側インピーダンスがRならトランスの出力インピーダンスも同様に決まります 1:nなら n×n×R
つまり繋げるもので決まるのです

マッチングトランス仕様には入出力インピーダンスが書かれてありますが 駆動側 負荷側ともに規定のインピーダンスの機器を繋いだ時 仕様の特性を保証しているのです
ですから違った入出力インピーダンスのものを繋いだ時は違った特性になります
使えなくはありませんがマッチングさせないと伝送効率が下がります
駆動側 負荷側ともにインピーダンスを変更してもマッチングさせる限りは構いません 但し帯域が変わります
例えばマッチングトランスの入出力インピーダンスより高い 駆動側&負荷側インピーダンスでマッチングさせると帯域が狭まりますし 最大入力レベルも変わります

QCGIからCGIを、CGI環境変数付きで実行するには?

CGI(Perl)からCGI(Perl)を実行してその出力を得るには
どうしたら良いでしょうか。

そのCGIがもっている環境変数(IPアドレスとか、POSTデータ)も
渡したいのですが・・・。

Openでパイプを使ってやればいいとまではわかり、
環境変数などを渡さないで純粋にCGIを実行させて
その出力を受け取るところまでは出来ました。

Aベストアンサー

Openでパイプを使って起動した子プロセスには、環境変数は全てコピーされるはずです。 どの変数が消えたり変ったりしてますか?


> 環境変数(IPアドレスとか、POSTデータ)

CGIパラメーターが環境変数として渡されるのは GETメソッドの場合です。 (GETメソッドの場合、URL上でも xxxx?a=1&b=2 の様にパラメーターを表現できます)

POSTメソッドの CGIパラメーターは、STDIN から入力します。 だから、これを子プロセスに引き継ぐには、それなりの工夫が必要です。

工夫というと、例えば以下のいずれかです。

・ 親が STDIN を読む前に子プロセスを起動する。

・ 親は入力した STDIN を記憶しておき、子プロセスの起動後に記憶内容をパイプで渡す。 子プロセスの STDOUT を親がパイプで読みたいなら、さらに面倒。 (パイプ指定の open() だけでは STDIN/STDOUT 両方のパイプは多分不可)

いずれの場合も、CGI.pm なんかを親が使うとまずいかも知れません。

Openでパイプを使って起動した子プロセスには、環境変数は全てコピーされるはずです。 どの変数が消えたり変ったりしてますか?


> 環境変数(IPアドレスとか、POSTデータ)

CGIパラメーターが環境変数として渡されるのは GETメソッドの場合です。 (GETメソッドの場合、URL上でも xxxx?a=1&b=2 の様にパラメーターを表現できます)

POSTメソッドの CGIパラメーターは、STDIN から入力します。 だから、これを子プロセスに引き継ぐには、それなりの工夫が必要です。

工夫というと、例えば以下のいずれかで...続きを読む

Q画像処理 (3次元のモデルと画像のマッチングのアルゴリズムについて)

画像処理を勉強しているものなのですが、
現在2次元画像同士のマッチング(テンプレートマッチング)などはプログラムが組めるのですが
計算機内に作った3次元のモデルと画像のマッチング、つまり3次元物体の姿勢推定のアルゴリズムがよくわかりません。簡単でいいので教えてください。
よろしくお願いします。

Aベストアンサー

アドホックですがX、Y,Zそれぞれで3次元モデルの画像(無限遠から見た画像)を作成して2分探索的にマッチングをかけていけばいつかは終わるのではないでしょうか?
対象物の色やテクスチャなどの特徴があればある程度探索空間を減らせるとは思いますが汎用的でなくなる可能性があります。

Q[Perl]ファイル出力のエンコード(EUC、SJIS、UTF8)を指定したい

EUCで書かれた文章を読み取ったにもかかわらず、S-JISで出力されます。
これを、任意の文字コードに指定して、出力する方法は無いものでしょうか?
ご存知の方、教えてください。
宜しくお願い致します。

Aベストアンサー

以下のサンプルは、コードをUTF-8 で記述して、標準出力をシフトJISで出力し、EUC-JPでファイルから入力します。
"<:encoding(euc-jp)" は、PerlIO レイヤの指定で、これを変えれば、ファイル出力を任意の文字コードにできます。
binmode STDOUT, ":encoding(euc-jp)";
のような指定もできます。
----------------------------------------------------------------
use encoding "UTF-8", STDOUT => "Shift_JIS";

open(FH, "<:encoding(euc-jp)", "EUC.txt");
while(<FH>){
print ;
}
close(FH);

Qアンテナのマッチング回路

現在アンテナのマッチング回路を考えているのですが、
自動でマッチングを取る方法はありますか?

キャパシタンスとインダクタンスを手動で変える方法を考えていますが、
(インダクタンスは諦めて、キャパシタンスは電圧で制御)
ならべく手を加えずにマッチングをとってくれる回路をご存知でしたら
教えてください。よろしくお願いします。

Aベストアンサー

何のアンテナのマッチング回路なのか良く分かりませんが、アマチュア無線ではSWR(送信電波の反射率)を最小にするマッチング装置が販売されています。 これらは手動ですが、これを自動化するのは技術的には可能だと思います。

参考URL:http://www.shinwa-musen.co.jp/swr.htm

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。


人気Q&Aランキング

おすすめ情報