PHP: Hypertext Preprocessor

PHP開発チームはPHP6におけるUTF-16化を断念。開発ブランチをPHP5.3へロールバックし、これまでに開発した機能をロールバックしたブランチへバックポートするという方針へ変更した。これはPHP6で取り組まれたUTF-16対応実装が予想以上に困難だったためと、UTF-16に移行することで得られる利益よりも不利益が多いことが判明したためだ。PHPにおける文字集合とエンコーディング回りの議論は振り出しに戻った。

しかし、変化は確実に訪れている。Mind the encodings!において「default_charset」がiso-8859-1からUTF-8へ変更されたことが紹介されている。ブラウザはサーバからのデータにエンコーディングの指定がなかった場合、これまではISO-8859-1をデフォルトエンコーディングとしていた。逆にPHPがブラウザからデータを受け取る場合もISO-8859-1をデフォルトエンコーディングとしてきた。今回、この部分のデフォルトがUTF-8に変更された。

わかりやすいところでは、コメントアウトされているがphp.iniの「default_charset = "iso-8859-1"」がそれに該当する。62101のコミットで同設定が「default_charset = "UTF-8"」と変更された。なお設定自身はコメントアウトされており、より正確には、「default_charset」が設定されていない場合のデフォルトエンコーディングがISO-8859-1からUTF-8に変更されたということになる。これまでエンコーディングの指定がなかった場合ISO-8859-1として処理されてきたクライアントから送られてくるデータはデータはUTF-8として処理されることになる。

Googleの調査によればWebで使われるテキストのエンコーディングはここ数年でUTF-8が急増しており、その割合は50%に到達するとみられている。UTF-8は今後も急増が見込めることから、今回の変更は妥当なものだとみられる。なお、これまでISO-8859-1を仮定した実装をしてきた場合には注意が必要。明示的にエンコーディングを指定するにはPHPコードの先頭で「ini_set('default_charset', $enc);」や「header("Content-type: text/html; charset=$enc");」などを実施すればいいという。なおこれは受け取るデータのエンコーディングの指定であって、スクリプトそのもののエンコーディングを指定するものではないし、データベースとやりとりするデータのエンコーディング指定でもないということに注意する必要がある。