カモランドの事情により,ブラウザからAjaxで日本語文字をサーバに送信する必要があった.

普通にHTMLでサブミットする場合は,ブラウザが勝手にそのページの文字コードかつURLエンコーディングした結果を送信してくれるのだが,Ajaxの場合はエンコードを自前でやらねばならない.

この場合,JavaScriptのencodeURIComponent()関数を使うのが一般的のようだ.これを使うと,ページのエンコーディングからUTF-8への変換とURLエンコーディングを行ってくれる.

サーバ側では,受信した内容をURLデコードして,さらに必ずUTF-8で来ているはずなので,簡単に必要な文字コードへ変換して使うことができる.

...なのだが? ハマったデス.

一部の文字において,JavaScriptでencodeURIComponent()を使ってUTF-8に変換したものを,サーバ側でPerlのJcode.pm,Encode.pmを使ってデコードできなかった.

ムキャーッ!とりあえず,〜(にょろ)と,−(全角ハイフン)は,駄目だった. おそらく他にもあるだろう.

decodeURIComponent('〜')='%EF%BD%9E' →しかしEncode::decode()可能なコードは'%E3%80%9C'
decodeURIComponent('−')='%EF%BC%8D' →しかしEncode::decode()可能なコードは'%E2%88%92'  <strike>'%E2%80%95'</strike>
今回の環境はEUC-JPだったのだが,これって,
  • ブラウザ上でのEUC-JP→UTF-8のマッピングと,サーバ側(Perl5.8 Encode.pm)でのUTF-8→EUC-JPのマッピングが異なる

ということなのだろうか.昔はJavaでの開発でよく聞いた話だが...

で,俺の場合結局どうしたのかというと,サーバ側で受け取ったデコード前の文字列に,直接

$a =~ s/%EF%BD%9E/%E3%80%9C/gi;
$a =~ s/%EF%BC%8D/%E2%88%92/gi;

という置換をかけることにした.

まさにその場しのぎの対応だが,ここまでたどり着いて力つきた.もう,疲れました.

...その後,詳しく調べたので,結果を以下のページにまとめた.

kamolandをフォローしましょう


© 2017 KMIソフトウェア