だから文字エンコーディングの自動変換は使わないように

ざくっとこのネタのもとについて.

うーん、だとするとMacだからですかねぇ?SJISの「表」をaddslashesを通しても、Magic_QuoteをONにしても「表」のままです。

mbstring.internal_encoding = utf-8が原因だったorz

察するところはありますが細かいことはあまり書かないで起きます.結論で言うと残念ながら多分それは原因ではないです(苦笑 by Tadashi "ELF" Jokagi
おろ。mbstring.internal_encodingとmbstring.encoding_translationの合わせ技的な原因なんだろうと察したんですが違うんですかね。

結論ではNo,mbstring.encoding_translationが諸悪の根源.
#諸悪とかいわれるなら何であるんだ? とかは別レイヤーの話なのでポイッ!!

前提条件

まず前提条件としてphp.iniを標準のもの(php.ini-dist,あるいはphp.ini-recommended)を用い,mbstringの設定を変えていない場合はこんな感じです.

$ grep 'mbstring' /etc/php5/php.ini
;extension=php_mbstring.dll
[mbstring]
;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
; mbstring.internal_encoding setting. Input chars are
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none;
; overload(replace) single byte functions by mbstring functions.
;mbstring.func_overload = 0
;mbstring.strict_encoding = Off
; With mbstring support this will automatically be converted into the encoding
; given by corresponding encode setting. When empty mbstring.internal_encoding

この前提で話を進めます.

原因

encoding_translationがOn,mbstring.http_inputがpass,あるいは省略以外の何らかの意味のある値になっていることが原因です.
ようするに「HTTP入力に対し,文字エンコードの自動変換をした」ということです.

mbstring.internal_encodingがUTF-8なだけで「この悩み事」は発生してなかったと思います.

HTTP入力だけ文字エンコードの自動変換してくれてうれしい?

DBの問い合わせ結果とかコマンドライン引数とかファイル読み込みPHPは実際問題いろんなものに対して文字エンコードを意識しなければなりません(そうでない場合はなるべく無意識にできるように「統一をする」ことが多いだけだと思います).

そもそも自分自身のコンテンツを操作するなら「どこでどういう文字エンコーディングを扱うべきか」は十分わかる場合が多く(せいぜいCSVの文字エンコードは? 位でこれもほとんどの場合はShift_JIS,実質SJIS-WINなどだったり),自分の支配下外のコンテンツの識別は自動変換程度できっちりできるものでもありません.

また,自動変換もmbstringの関数一発で変換もできます.

define('HTML_CHARACTER_ENCODING', 'UTF-8');

//  個人的には$_GETを更新するのは好きではないけど手抜きです(苦笑
mb_convert_variables(mb_internal_encoding(), HTML_CHARACTER_ENCODING, $_GET);

必要に応じてこの辺を適切に使えばmbstring.http_inputに頼る必要はほぼ皆無になるでしょう.

それでは出社します.
あでゅー