hnwの日記

PHPのロケールに関するまとめ


5/3 17:45追記:t_komuraさんに指摘いただいた関数と、さらに僕が調べ直したものを含め、「ロケール設定に従う関数一覧」に25個ほど追加しました。かなり見落としがありましたね…。


PHPロケール*1まわりについて調査したので、これをまとめてみます。


この記事は「ロケールの影響を受ける関数 - Sarabande.jp」を掘り下げたものです。masakielasticさん、ナイスな記事をありがとうございます。

PHPの文字列型と文字エンコーディング

他のモダンなLL言語と異なり、PHPは文字列の文字エンコーディングに関して何も仮定せず、単なるバイト列として管理しています。つまり、文字エンコーディングの取り扱いは各関数の実装に委ねられています。


下記の通り、これはマニュアルにも記述があるのですが、実に残念なことです。

残念ながら、PHP の各関数が文字列のエンコーディングを判断する方法はまったく統一されていません。


文字列型の詳細 - PHP: 文字列 - Manual


とはいえ、引用元の文章では各関数と文字エンコーディングの関係を下記のように大別しています。


これを見ると、それぞれの関数の出自によって挙動が変わっているようです。PHP本体の実装として、OSの機能に頼ったり他所から持ってきたライブラリに頼ったりと実装がバラバラであることが混乱の一因だといえるでしょう。


本稿では、3番目の分類にある「ロケール」について詳しく見ていきます。

*1:ロカールの方が本来の発音に近いらしいと聞きましたが、10年以上もロケールと呼んでいるので僕個人はこのまま押し通す気でいます

続きを読む