プロが教える店舗&オフィスのセキュリティ対策術

具体的におたずねします。
オークションサイト一括検索サイトを作っているのですが、JavaScriptで、検索をかけるurlを送信(?)しても、
検索文字が日本語だと検索できないサイトがあり困っています。

window.location.href = xxxx;

という感じで、新たなブラウザを開いてやってます。

xxxxには

"http://auction.curio-city.com/itemlist.jsp?pn=0& …

などが入ります。

上記でアクセスすると検索文字が"test"なので問題ない
のですが、

"http://auction.curio-city.com/itemlist.jsp?pn=0& …テスト"

などとするとエラーになってしまいます。

調べた結果、文字列をURLコードというものに変換すれば解決しそうなのですが、JavaScriptでこれを行うのは不可能に近いようです。

どんな方法でもよいので、日本語で検索できるようにする方法はないものでしょうか?

どうかお詳しい方よろしくお願い致します。m(_ _)m

A 回答 (5件)

name="form1"なる属性を持つformをsubmitする場合、


document.forms.form1.submit();
でできますので、「複数同時に」というのはそれほど問題ではないと思います。

しかし、例示されているページを調べてみたところ、Shift_JISでのエンコードを前提としてクエリー文字列を受け取っているようでした。
このため、window.open()で新しいページを開いてフォームを書き込み、それをsubmitする、という方法ではうまくいきません。
(書き込まれるコードがShift_JISとは限らないため。ちなみにIE6ではUnicodeのようでした。)
従って、文字コードの問題を解決するための小細工が必要になります。

1.VBScriptを利用する
VBScriptにはUnicodeへの変換なしに文字コードを取得する関数がありますので、これを使用すれば自力でエンコードできます。
但し、NetscapeはVBScriptを実行できません。

2.JavaScriptで小細工する
この場合、madmanさんのご指摘通り、ブラウザのエンコード機能を利用することになります。
が、ブラウザにShift_JISでエンコードしてもらうためには、submitするフォームが所属するページがShift_JISで書かれている必要があります。
このため、Shift_JISで書かれたスケルトンページを用意し、そのページをwindow.open()で開いて値を設定し、submitする、という方法が考えられます。
但し、異なるウィンドゥへのデータの書き込みは制限されているため、
スケルトンページ側に書き込み用関数を用意して、それを通してキーワードを設定する、という手順が必要になります。

DHTMLを使用しない場合には、スケルトンページはオークションサイトの個数分用意しなければなりません。
DHTMLを使用する場合には、スケルトンページは1つでできますが、古いブラウザには対応できなくなります。

ちなみに、HTML中でクエリー文字列付きのURIを記述する場合には、"&"は"&"と記述するのが正解です。
    • good
    • 0
この回答へのお礼

とても詳しいご回答ありがとうございます。
その後、複数のブラウザを開いて検索するのは後回しにし、ひとまずsubmit()でformの値を送信することに成功しました。複数のブラウザを開くのなら、formを複数用意し、それぞれを個別に送信するようにすればいいんですよね?そこまではわかりました。また、この方法で一部のサイトは解決しそうです!
しかし、例としてあげたページ(楽天ですが)はEUCコードしか受けつけないようです。zzzzzzさんは、IE6.0ではunicodeのようだとおっしゃってますが、それはURLコードではないでしょうか?
先の方法ではURLコードになるのですが、楽天ではEUCコードしか受けつけないので、エラーとなってしまいます。
ちなみにヤフーではURLコードでもEUCコードでもOKのようです。こちらでその問題が指摘されていました。http://www.survive.ne.jp/lunascape/about.html
JavaScriptでのEUCコードへの変換は漢字コードにしたがって一文字づつ変換しない限り無理とのことで、ほとんど不可能に近いようです。
というわけでほとんど絶望していますが、formを個別にsubmitする方法を教えていただけのは大きな収穫でした。
とりあえず、その後学習したことをまとめて見ましたが、何か間違いがありましたら、ご指摘頂けると幸いです。
ありがとうございました。

お礼日時:2002/04/09 07:06

ブラウザのJavaScriptの実装を信用するなら、スケルトンなしで次のように書くことができます。


試してみてください。

<HTML>
<HEAD>
<SCRIPT>
function openWithQuery(url, querys, charset) {
var win = window.open();
win.document.open();
win.document.charset = charset;
var tmpstr = new Array();
var i = 0;
tmpstr[i++] = '<HTML>\n<HEAD>\n<META http-equiv="Content-type" content="text/html;charset=' + charset + '">\n</HEAD>\n';
tmpstr[i++] = '<BODY>\n<FORM name="form1" action="' + url + '">\n';
for (var key in querys) {
tmpstr[i++] = '<INPUT type="hidden" name="' + key + '" value="' + querys[key] + '">\n';
}
tmpstr[i++] = "</FORM>\n</BODY>\n</HTML>\n";
win.document.write(tmpstr.join(""));
win.document.close();
win.document.forms.form1.submit();
return win;
}

function search(keyword) {
var url = "http://auction.curio-city.com/itemlist.jsp";
var query = new Array();
query["pn"] = "0";
query["so"] = "4";
query["sd"] = "0";
query["kw"] = keyword;
openWithQuery(url, query, "Shift_JIS");

// オークションサイトを追加する場合にはここに記述
}
</SCRIPT>
</HEAD>
<BODY>
<FORM name="form1" onsubmit="search(document.forms.form1.keyword.value); return false">
<INPUT type="text" name="keyword" value="テスト">
<INPUT type="button" value="検索" onclick="search(document.forms.form1.keyword.value)">
</FORM>
</BODY>
</HTML>

この回答への補足

先日は色々と教えていただきましてありがとうございました。実は、その後、同じ楽天でも、これまで指定していたcgiとは別のcgiを指定することで、日本語検索が可能となることが判明し、それで解決してしまいました。せっかく教えて頂いたのに全てを消化できずに終わってしまいましたが、非常に多くの有益な情報を得ることができました。スケルトンページを使った方法は何か別の機会に生かしたいと思います。本当にありがとうございました。

補足日時:2002/04/23 16:07
    • good
    • 0
この回答へのお礼

本当に感謝しております。
私一人で考えていたら、一体何日かかったかわかりません。本当にありがとうございます。

win.document.charset = charset;

この操作方法を教えていただいたおかげで、 IEでは全て日本語で検索可能となりました。
問題の楽天に関しては、新たに開いたウィンドウをX-EUC-JPまたはEUC-JPにすると良いようです。
しかし、ネスケではこれは無効のようですね。
ネスケでもどうにかしようと、#5のアドバイスにしたがって新たに書き出す方法でも試してみましたが、こちらでもダメでした。
先に報告しましたようにネスケでは、あらかじめEUC-JPにしておいたページからは日本語検索できることが確認できてますので、おそらくzzzzzzさんの仰るスケルトンページを用意することで解決すると思います。
結果はまた後ほどご報告致します。

お礼日時:2002/04/14 14:45

>zzzzzzさんは、IE6.0ではunicodeのようだとおっしゃってますが、それはURLコードではないでしょうか?


ビルトイン関数のescape()の話ではなく、window.open()→document.write()で新しいページに書き出したときの、文字コードの話です。
これがUnicodeになっているようですので、スケルトンページの助けなしには、ブラウザのエンコード機能に、文字コードがShiftJISであることを指定できないのではないか、ということが言いたかったのです。
なお、文字コードの問題と、URLエンコードの問題は全く独立のものです。
文字コードがEUCであろうとShiftJISであろうと、URLエンコードをしなければ送信できないことには変わりありません。

>楽天ではEUCコードしか受けつけないので
手でエンコードしてデータを送ってみましたが、やはりShiftJISしか受け付けないようです。EUCではうまくいきませんでした。

と、理屈ばかり書いていても仕方がありませんので、論より証拠、ということで、スケルトンページを使用した実装例を挙げてみました。
但し、この方法はDOM(Document Object Model)の実装を使用しているので、IE5以降か、Netscape6以降でしか利用できません。
#2にも書きましたが、オークションページ毎に個別のスケルトンを用意することでこの制約は回避可能です。

[skeleton.html](必ずShiftJISで保存してください)
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html;charset=Shift_JIS">
<SCRIPT>
// assume browser's exact interpretation of META tag
function addQueryString(name, value) {
var element = document.createElement("INPUT");
element.setAttribute("type", "hidden");
element.setAttribute("name", name);
element.setAttribute("value", value);
document.forms.form1.appendChild(element);
}
</SCRIPT>
<BODY>
<FORM name="form1">
</FORM>
</BODY>
</HTML>


[呼び出し側](適当に名前を付けてください)
<HTML>
<HEAD>
<SCRIPT>
basePage = "skeleton.HTML";

function openWithQuery(url, querys) {
var win = window.open(basePage, "_blank");
var form = win.document.forms[0];
form.action = url;
for (var i in querys) {
win.addQueryString(i, querys[i]);
}
form.submit();
}

function search(keyword) {
var url = "http://auction.curio-city.com/itemlist.jsp";
var query = new Array();
query["pn"] = "0";
query["so"] = "4";
query["sd"] = "0";
query["kw"] = keyword;
openWithQuery(url, query);

// オークションサイトを追加する場合にはここに記述
}
</SCRIPT>
</HEAD>
<BODY>
<FORM name="form1">
<INPUT type="text" name="keyword" value="テスト">
<INPUT type="button" value="検索" onclick="search(document.forms.form1.keyword.value)">
</FORM>
</BODY>
</HTML>

この回答への補足

最初の質問時に例として挙げていたurlは「楽天」ではなくて、「大魔オークション」という別のサイトでした。
現在唯一日本語検索できずに困っているのは
http://trading.rakuten.co.jp/
の方で、以下のようフォームを組んで送信しても
検索できず困っています。

<FORM NAME="RakutenF" METHOD="GET" ACTION="http://esearch.rakuten.co.jp/search/e.search" target="_blank">
<INPUT TYPE="hidden" NAME="sitem" VALUE="テスト">
<INPUT TYPE="hidden" NAME="sv" VALUE="5">
</FORM>

補足日時:2002/04/14 08:51
    • good
    • 0
この回答へのお礼

懇切丁寧なご回答ありがとうございます。
その後、OKwebからのメールが来ていなかったようだったので、ご回答頂いていたことに今まで気付いていませんでした。
内容もかなり難しくなってきましたので、zzzzzzさんのアドバイスを消化するのに時間がかかりそうですが、後日、結果をご報告したいと思います。
なお、その後、NC4.7ですと、CHARASET を EUC-JPにして送信することで、検索ができました。(他が文字化けしてしまいますが)IE6.0ではエラーとなってしまいました。
今後も調査を続けたいと思います。
なお、現在製作中のサイトのアドレスはこちらです。
http://www.kitanet.ne.jp/~hashimo/okudoku/auctio …

お礼日時:2002/04/14 08:48

Javascriptならば、escape関数で簡単に文字列をURLエンコードできると思いますよ。

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

ご回答ありがとうございます。escape関数でURLエンコードできたは、IE4.0までだそうです。何かの団体の仕様に合わせた所5.0移行UNICODEに変換されるようになってしまったとか。そういうわけでescapeではダメなんですよ~。。。

お礼日時:2002/04/08 04:30

FORMを作成し、各引数をFORMの情報として格納し、指定URIに(この場合

http://auction.curio-city.com)submitするようにすれば問題ないのではないですか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。それが一番確実だとは思うのですが、一つのボタンをクリックするだけで、複数のブラウザを開いて複数サイトを検索するようにしたいのです。アドバイス頂いた方法では、それぞれのサイトごとにボタンが必要になるのではないかなと・・・。
一つのFORMから、複数の隠しFORM(こういうのがあるのかどうかは別として)に検索文字を渡して、それを一斉にsubmitというのができればいいのですが・・・いかんせん、レベルが低いので可能かどうかすらも判断できません・・・。

お礼日時:2002/04/07 22:45

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