PHPのurldecode関数にそれぞれの文字列を渡すと、前者はShift_JISで「諸葛亮」、後者はUTF-8で「諸葛靚」が得られる。こちらもやはり、どちらか一方でのデコードを試み、それに失敗してから他方のデコードを試みているのだろう*3。Shift_JISとUTF-8でかぶっているコードがどうなるかは試してないので分からない。コードのかぶってる文字があるのかどうかも知らないし。
このurldecode関数だと、返り値のコードがShift_JISなのかUTF-8なのか分からないので、ちと困る。mb_parse_str関数を使うと、どのコードで渡してもかならずUTF-8で返ってくるので*4、いい感じ。これも内部で自動的に判断し、変換してるんだろう。
なんでこういうことを書いたかっていうと、【Wikipedia】みたいにURLの一部として渡されたクエリ文字列をキーにデータベースからデータ引っぱってくるような仕組みを作りたかったんだけど、実際テストしてみたらIEやOperaでは問題なかったのにFireFoxで試したときだけ検索に失敗したので、おかしいなと思って調べたら、FireFoxのときだけ文字列がShift_JISで渡されたのに気付いたというわけなんですね。あたしゃてっきりどのブラウザでもUTF-8でしか渡されないと思いこんでたよ。
それじゃWikipediaではどういう扱いをしてるんだろうと思ってMediaWikiのソースをダウンロードしてみても、どうも文字コードを変換してるらしいところは見られない。おっかしーなーと首をひねった後で気がついた。
FireFoxではWikipedia使えねぇじゃん。
FireFoxのロケーションバーに入力された文字列はShift_JISでエンコードされるから、UTF-8の文字列をキーにしてるWikipediaでは当該記事を見つけられず、記事がないよと言われてしまう。オプションを開いても標準エンコードをUTF-8に変える選択肢のないFireFoxもダメぽだし、UTF-8前提でShift_JISを受けつけないWikipediaもダメぽだし、ダメとダメがぶつかってダメダメになっちゃった。
などとちょっと腹立ちまぎれに検索してみたら、「ツール→オプション→コンテンツ→フォントと配色→詳細設定→規定の文字エンコーディング」に設定があるらしい。深えよ!しかもフォントの問題じゃねえよ!しかしようやく「諸葛靚」が検索できるようになった…と思ったら「諸葛亮」だとエンコードに失敗して検索できねえよ!なんでかと思って調べてみたら、「諸葛靚」だとUTF-8で渡されて、「諸葛亮」だとShift_JISで渡されてる。またしてもお前か…!つねにUTF-8で送信してくれよ!*6
FireFox+Wikipediaでぐぐっても、関連の話題はあんまり出てないみたいだし*7、FireFoxのバージョンの問題かもしれないね。少なくとも2.0.0.4では上記のとおりでした。
こんな機能を持っています。
★ URL を表示するアドレスバーで、2バイト文字情報を含む URL エンコードをデコードして表示する
例えば、デスクトップにおいたファイルを Firefox でブラウズすると、アドレスバーはこのような表示になってしまいます。
これでは何がなんだかわかりません。
そこで、拡張機能 Locationbar2 をインストールすると、アドレスバーにデコードして表示されます。
Google や Wikipedia などをブラウズしたときも、デコードして表示されるので分かりやすくなりますよ。
★ shift キーを押しながらアドレスバーにマウスを持っていくと、「/」(スラッシュ)で区切られたディレクトリ名をクリックすることでディレクトリの移動ができる
階層が深い Web サイトのときはかなり重宝してます。
簡単に説明すると、例えば hxxk.jp 内のタグ "ビール" が設定された記事のように、 URI にマルチバイト文字列を含むリソースへのリンクを指し示したい場合、 hxxk.jp 内では <a href="http://hxxk.jp/tag/ビール">hoge</a>
と記述してもリンク元もリンク先も UTF-8 であるので Firefox では無事に該当リソースに到達できますが、同じようなリンクを Shift_JIS のリソースに記述すると http://hxxk.jp/tag/%83r%81%5B%83%8B という URI としてエンコードされてしまい、該当リソースに到達することができません。 なお、文字コードが同じであれば該当リソースに到達することができますが、そもそも仕様上非 ASCII 文字列を URI に直接記述することはしてはいけません。
そこで、私が hxxk.jp 内でタグページへのリンクを記述する場合は <a href="http://hxxk.jp/tag/%E3%83%93%E3%83%BC%E3%83%AB">hoge</a>
のようにあらかじめ UTF-8 でエンコードした状態で記述しています。 このようなリンクであれば仕様の面でも問題ありませんし、 Shift_JIS のリソースや EUC-JP のリソースに記述しても問題なく該当リソースに到達することができます。 ( よって、他の方がタグ "ビール" が設定された記事を参照したい場合も、 UTF-8 エンコード済の URI をコピーすることで問題なくリンクすることができます。 )
さて、ここで Firefox のアドレスバーに、 URI を直接入力してリソースを取得することを考えてみましょう。 現バージョンである Firefox 1.5.0.6 では、デフォルトでは network.standard-url.encode-utf8 の値は false になっていますので、アドレスバーにマルチバイト文字列を含む URI を入力すると Shift_JIS でエンコードされます。 すなわち、 http://hxxk.jp/tag/ビール とアドレスバーに入力しても http://hxxk.jp/tag/%83r%81%5B%83%8B という URI をリクエストした形になってしまいます。 そこで OpenCage: Firefox urlエンコード機能をUTF-8化する方法。を参考に network.standard-url.encode-utf8 の値を true にすると、 http://hxxk.jp/tag/ビール とアドレスバーに入力すると http://hxxk.jp/tag/%E3%83%93%E3%83%BC%E3%83%AB という URI をリクエストした形になり、無事に該当リソースに到達することができます。
usopionさんがUTF-8でURLエンコードされたURLを取得するブックマークレットを作成された。普段すべてのアドレスをUTF-8でエンコードするのチェックボックスを外して使っていたが、そうしているとUTF-8で記述されていないウェブページ上に全角文字を含むリンクが在った場合に問題が発生するようだ。ブログなどに投稿するためにエンコードされていない状態のURLを取得する機会と全角文字の含まれるURLへのリンクを踏む機会。どちらが多いと問われれば、私の場合間違いなく後者だ。
……ということで、x alt, u, r, lにGo to page, "javascript:prompt('現在の URI',encodeURI(location.href).replace(new RegExp('%2525([\\da-f])','gi'),'%25$1'));void(0);"
を割り当ててみた。これで必要な時にはエンコード前のURLを取得できる。若干opera_exが不便になるが致し方あるまい。どうにかならないかといくらか試行錯誤してみたが、僕の手ではどうにもならなかった。
javascript:alert('<a href="http://matatabi.homeip.net/'+encodeURI(location.href)+'" target="_blank">'+document.title+'</a>');