« Mac版IE5.23(Panther、Tiger)とチルダの文字化け | トップページ | Safariと半角円マーク(Shift_JIS編) »

2006/09/06

Safariと半角円マーク(EUC-JP編)



東芝ダイレクトPCなら全国配送料無料!!

MacOSXのブラウザSafariには、フォームに入力された「\」(0x5C)の処理に関する問題があります。Shift_JISのホームページでもEUC-JPのページでも問題が起こるのですが、今日はEUC-JPのページで起こる問題について触れていきたいと思います。

●【FreeStyleWiki】半角の円記号(バックスラッシュ)の編集に問題があるSafariブラウザ対策をします。
http://fswiki.poi.jp/wiki.cgi?page=BugTrack-plugin%2F74

EUC-JPのページの場合、半角円マーク「\」でも半角のバックスラッシュ(Macだと、optionキーを押しながら半角円マークが刻印されたキーで入力できます。)でも、ともにフォームデータが送信された時点で「クエスチョンマーク=『?』」に文字化けしてしまうという問題のことです。

--- 2007年6月16日20時50分ごろ追記start ---
この不具合は、2007年6月にリリースされたSafari 3.0 Betaで修正されました。Windows版、Mac版ともに確認しました。
--- 2007年6月16日20時50分ごろ追記end ---

サーバに送られる前に文字化けしていることは、POSTではなくGETにすれば、「%5C」(=\)ではなくて、「%3F」(=?)にURLエンコードされて送信されていることがわかります。

で、このFreeStyleWikiさんでは、「全角の円マークを入力してくれれば、サーバ側で半角円マークに置換します」「その代わり、(Safariユーザーのみならず他のブラウザ使用者も)全角円マークは入力できなくなるけれど、その点はご了解を」としているわけです。

これは、実に賢い解決法だと思いました。ただ、Safariユーザーの方は半角円マークを入力したい時に全角円マークをわざわざ意識して入力しないといけないので、その点だけ面倒だなと思いました。

そこで、JavaScriptで自動的に置換してPOSTするなりGETして、そのデータをサーバ側で元に戻す作業にしてみてはどうかなと思って、ちょこちょことプログラミングしてみました。

のような感じです。

ポイントは、submitされた時にJavaScriptでの置換が可能なように、onSubmitをかましていること。そして、JavaScriptで入力された値(document.myForm.keywords.value)を取得し、一文字ずつ切り出し、その文字コードを求めます。文字コードが92であれば、半角円マークもしくは半角バックスラッシュですので、それを全角円マークに置換します。修正したデータをもう一度document.myForm.keywords.valueにセットし、JavaScriptでsubmitさせます。

さらに、サーバ側(PHP側)で、全角円マーク(0xA1EF。EUC-JPであることに注意。)を半角円マーク(0x5C)に置換します。

とすればいいでしょう。

ここで、注意事項がいくつかあります。
1..Safariで半角円マークを入力しても、正しく動作するようになります。また、Safariで半角バックスラッシュを入力した場合は、この対策の結果、見た目が半角円マークに変化しますが、それ以外の点は期待どおり、動作するはずです。

2.ユーザーが意図して、全角の「¥」(円マーク)を入力していた場合、この対策があだとなって、入力文字とは異なる半角円マークに置換されてしまうことになります。

3.ただし、ユーザーが全角のバックスラッシュ「\」を入力した場合には、置換対象になりませんので、「2.」のような問題はそもそも発生しません。

4.JavaScriptをoffにしている場合、データは置換されることなくそのまま送信されますが、Safari以外のブラウザのユーザーの方は、問題は全く発生しません。対策前と全く同じです。

5.JavaScriptをoffにしている場合、データは置換されることなくそのまま送信されるため、Safariでは不具合が修正されることなくデータがサーバに送信されてしまうため、Safariユーザーが入力した半角円マーク「\」や半角バックスラッシュは、やはり、「?」に文字化けします。対策前と同じ状態になります。





いろいろ書きましたが、この対策によって生じる不具合・問題点は2つあります。一は、SafariでJavaScriptをoffにされている場合、救済のしようがないこと。もう一つは、ユーザーが全角円マークを意図して入力した場合でも、半角円マークに強制的に置換されてしまう(=実質的に、全角円マークをデータベースなりに登録できない。)ということであり、結局、冒頭で紹介しましたFreeStyleWikiさんの対策の仕様と、この点は同じことになります。

このことが気になる場合は、そもそも半角円マークを全角円マークという単純な文字列に変えているのが問題なのですから、半角円マークをJavaScriptで「¥¥」でも、「¥あ」「¥ん」、「¥円」「あM84」でも、「まずはありえない」という文字列にいったん置換し、それをサーバ側(PHP)で半角円マーク(0x5C)に置換しなおすという作業をすればいいでしょう。

ただし、JavaScriptで置換した値が入力フィールドに再セットされる関係上、データがサーバに送信される前に、その置換後の文字も一瞬ですが見えますので、あまり恥ずかしくなるような文字列に変えるのはエレガントでないような気がします。

JavaScriptを有効にしていることを強要できるシステム・環境であるならば、このようなJavaScriptによる置換はかなり有効(実装するのは、少々面倒ですが・・・)のように思われます。全角円マークが入力できなくなる問題点は確かにありますが、逆に全角円マークを入力されたらJavaScriptでエラーを出すこと(charCodeが65509なので)は簡単ですから、「全角円マークは使わないでください」「全角円マークを入力されても、半角円マークになりますよ」とアラートを出すこともできるでしょう。



|

« Mac版IE5.23(Panther、Tiger)とチルダの文字化け | トップページ | Safariと半角円マーク(Shift_JIS編) »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67411/11784990

この記事へのトラックバック一覧です: Safariと半角円マーク(EUC-JP編):

« Mac版IE5.23(Panther、Tiger)とチルダの文字化け | トップページ | Safariと半角円マーク(Shift_JIS編) »