問題はエンコーディングではないのだ

…という分析を読みました。


http経由。

httpのGETやPOSTメソッドを用いた通信が主流だ。さて、GETやPOSTによって送られるパラメータは何者だろうか?

パラメータは決して文字列ではない。それどころかバイト列ですらない。答えはオクテット列だ。


つまり。

ただのオクテット列をそのまま文字列として扱えば不都合が出るのは当然だろう。ここでしている操作はC++で言えばreinterpret_castなのだから。もしオクテット列が想定している文字エンコードに合致していたとすれば、それは単に幸運だったのだと思うくらいでちょうど良い。


〆。

で、対策は次の通り。要するに「自分が欲しいもの=文字列」と「実際に受け取るもの=オクテット列」を区別すれば良い。

  • 文字列を期待しているパラメータは、最初にオクテット列から文字列への変換を行う。
  • 文字列の処理はそのエンコーディングに対応した文字列処理関数だけを使う。