Shift_JIS環境で設置していたGoogleカスタム検索が動かなくなった時の対処例
昔設置したGoogleカスタム検索が気付いたら動かなくなってしまっていたので、修正しようとしたのですが結構ハマってしまったので記事にしてみました。
気付いたら動かなくなっていたGoogleカスタム検索
結構昔に構築したサイトの中に、Googleカスタム検索を設置していたサイトがあったのですが、「検索が動かなくなってしまった」という連絡を受けたので調査をしてみました。
Googleの仕様変更後(?)Shift_JISで動作しなくなった模様?
当時制作したサイトはShift_JISで構築し、その環境内でGoogleカスタム検索も問題なく動いていました。その後、検索フォームまわりは弄っていないはずなのに突然動かなくなってしまったので色々試してみたら、マルチバイトで検索を掛けた場合に不具合が発生している事に気付きました。(半角英数文字での検索は、問題なく動作していましたので。)
似たような事例を見つける
Googleカスタム検索を使用する際の文字コードについて | Google 検索 ヘルプ フォーラム
https://productforums.google.com/forum/#!topic/websearch-ja/OeSCG4vSwKw
Gooleで色々検索していたら、似たような症状で困っている人からの質問が見つかりました。
上記フォーラムに投稿している日付から察するに、恐らくGoogleカスタム検索側で、最近仕様変更があったのではないかと推測されます。
早速フォーラムのソースを参考に修正を加えてみることにします。
修正前のソース(Googleカスタム検索 フォーム入力部分)
<form action="google_search.php" id="google_search"> <input type="hidden" name="cx" value="自分のID" /> <input type="hidden" name="cof" value="FORID:11" /> <input type="hidden" name="ie" value="Shift_JIS" /> <input type="text" name="q" /> <input type="submit" name="sa" value="search" /> </form>
フォーラムを参考にした修正後のソース
<form action="google_search.php" id="google_search"> <input type="hidden" name="cx" value="自分のID" /> <input type="hidden" name="cof" value="FORID:11" /> <input type="hidden" name="oe" value="Shift_JIS" /> <input type="text" name="q" /> <input type="submit" name="sa" value="search" /> </form>
ポイントは、パラメータのieを削除して、ブラウザの自動判別にしているところ?
あとは、oeパラメータ(検索結果の文字コード)を念のため追加しています。
フォーラムの事例通りでは改善されず・・・URLに渡される変数を注目してみることに
これで「やったか!?」と思いましたが、自分の調査しているサイトでは改善されませんでした。ほかにも何か原因があるのかと思いChromeのデベロッパーツールを開いたら、Uncaught URIError: URI malformed というエラーが出ていることに気付きました。
調べてみるとURLに含まれている文字列に不具合があるということらしいので、Googleカスタム検索へ渡されるURLの変数を見たところ、検索フォームに入力されたマルチバイト文字がうまく変換されていないことに気付きました。
例えばフォームから「あいうえお」と入力して検索を行うと、正常に動作するGoogleカスタム検索では、結果が表示されるページ側に送られるURLは以下のようになります。
http://サイトアドレス?cx=自分のID&q=あいうえお&lr=lang_ja&oe=Shift_JIS...
しかし不具合の出ているGoogleカスタム検索ではこんな感じになっていました。
http://サイトアドレス?cx=自分のID&q=%82%a0%82%a2%82%a4%82%a6%82%a8&lr=lang_ja&oe=Shift_JIS...
クエリーの文字列がURLエンコードされている状態ですね。
恐らくShift_JIS環境から送られた変数をGoogleのスクリプトを通したときに不具合が発生しているのかなと思ったので、以下の様な形で送信される情報の文字コードを固定してみることにしました。
フォームから送信する情報をUTF-8に固定したらうまくいった
<form action="google_search.php" id="google_search" accept-charset="UTF-8"> <input type="hidden" name="cx" value="自分のID" /> <input type="hidden" name="cof" value="FORID:11" /> <input type="hidden" name="oe" value="Shift_JIS" /> <input type="text" name="q" /> <input type="submit" name="sa" value="search" /> </form>
変更した部分は form タグの部分で、accept-charset という属性を追加して、UTF-8として情報を送信するようにしています。
こうすることで、クエリーの文字列がGoogleカスタム検索側へ正確に渡され、エラーを吐き出さずに動作するようになりました。
異なるサービスで情報を受け渡しする場合は、文字コードを統一するのが理想的なのですが、昔作ったサイトで既に数百ページにも及ぶ場合は、修正するのも一苦労ですからね。応急処置ですがうまく行って良かったです。
- 2015年10月16日
- HTML
- 2件のコメント
数年前から Google検索 で英字以外では検索結果が表示されなくなって、ずっと悶々としていました。
文字コードがキーだと思って検索したら、貴サイトにたどり着くことができました。
このサイトで書かれている通りに修正したところ、日本語文字で検索結果が表示できるようになりました。
長年の不満が解消してとても喜んでいます。
対処方法を明記いただき、有難うございます。
こんにちは。
結構昔書いた記事でしたが、残しておいてよかったです。
Googleも突然仕様変えたりするので困惑しますよね。
コメントありがとうございました。