[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
PHP の調べ物
さてさて、毎回Web上にある設定の変更できないレンタルのサーバの環境とローカル環境の違いを把握して・・・どうのこうの・・・
みたいなややこしいことをしてきた結果、当たり前であろう事により一段と近づく結論が浮かんだ。
それは「設定の修正が効かない側のサーバ(レンタルサーバ)の環境に極力ローカルの開発環境も整える」こと。
という結論が出た、とても当たり前と言えば当たり前だ・・・。
文字化け以外にも、文字カウントを失敗するないていうことが、
デフォルトの 内部文字エンコーディング ->mbstring.internal_encoding (php.ini内)
や
関数で指定した内部文字エンコーディング ->mb_internal_encoding 関数
によって起こる事が判明した。
まず、この結論にたどり着くまでに気がついた事柄を述べる。
<まずテストする為のソースコード>
<?php
$string = '内部文字エンコーディング環境のTESTです!'.mt_rand(0,9).mt_rand(0,9).mt_rand(0,9);
// 文字の長さの検出の色々な仕方
var_dump(strlen($string)); //内部文字エンコーディングが違う環境に依存しない(バイト数)
var_dump(mb_strlen($string)); //内部文字エンコーディングが違う環境に確実に左右される
var_dump(mb_strlen($string ,'UTF-8')); //内部文字エンコーディングが違う環境に依存しにくい
?>
これを参考に以下、1. 2. 3. を見てもらえば判ると思う。
1.文字数をカウントする計算式に狂いが生じる。
内部エンコーディング:ISO-8859-1
と
内部エンコーディング:UTF-8
では部分的に違う出力結果になる。
内部エンコーディング:UTF-8 の場合、上から答えが int 61、 int 25、 int 25 となる。
内部エンコーディング:ISO-8859-1の場合、上から答えが int 61、 int 61、 int 25 となる。
2.カウントしたい文字列が1文字が1バイト以上の文字である場合には、
文字数カウントに使えない関数がある。
つまりこの例のスクリプトの場合は、
var_dump(mb_strlen($string)); //内部文字エンコーディングが違う環境に依存しない
がバイト数でしか文字列がカウントできないです。
そしてまた、文字としてカウントできるとしても、正しい文字エンコーディングを指定していない場合、
存在しない文字を他の文字に読み違えたりして間違って文字を認識したりした結果、
文字数が変わってしまうのが、
var_dump(mb_strlen($string)); //内部文字エンコーディングが違う環境に確実に左右される
です。
また、内部エンコーディングを指定して文字数をカウントさせているので、一番文字数のカウント間違えが
少ないと思われる、
var_dump(mb_strlen($string ,'UTF-8')); //内部文字エンコーディングが違う環境に依存しにくい
ですが、
依存しにくいと書いているのは、保存形式によって保存された文字が
本当に指定したコードで文字を間違えて文字化けなどをせずに解釈できるのかどうかの
テストは今回行っていないからです。
3.サーバの環境によってデフォルトの設定があるので、
文字数カウントの関数の引数が任意であっても指定した方が環境が変わっても、
スクリプトが同様に動く可能性が高くなる。
// 文字の長さの検出の色々な仕方
var_dump(strlen($string)); //内部文字エンコーディングが違う環境に依存しない
var_dump(mb_strlen($string)); //内部文字エンコーディングが違う環境に確実に左右される
var_dump(mb_strlen($string ,'UTF-8')); //内部文字エンコーディングが違う環境に依存しにくい
?>
コメント一覧