This link has been bookmarked by 14 people . It was first bookmarked on 14 Feb 2007, by washo ohsaw.
-
27 Jun 12
-
18 Jun 10
-
14 Jun 10
-
17 Feb 09
-
22 Jun 08
-
どうすれば文字化けが起こらないようになるのか。
それは
自動変換を利用しない
ことだ。
変換の基準となる文字コードを一つ設ける。
文字コードの変換はすべてプログラム上で行い、
自動変換させるのは極力無くす。
これが最も効果的な方法。
自動変換とはhttp_input、http_outputの様なフィルター系や、
default_charsetの様な付加系(?)のようなもの。
これらを利用しないことが重要なのである。
もちろんこれは非常に煩わしい作業だ。
GETやPOSTのデータも一つ一つ変換しなければならないことになる。
(always_populate_raw_post_data = Onで、
$HTTP_RAW_POST_DATAを変換するという手もあるが)
全部手動が煩わしいというのならば、
自動変換される過程を理解した上で利用する必要がある。
だが、私も含めてほどんどのPHPプログラマにはかなり難しい内容だと思う。 -
●default_charsetはデフォルトの文字コードのことではない。
非常に誤解しやすい内容。
default_charsetというパラメータはご存じの人も多いと思う。
それに大抵の初心者本にはこれを設定するように書いてあるが、
むしろ逆である。
default_charsetとは
出力時にHTTPヘッダとして送信する文字コード名
のこと。 -
●languageパラメータは内部言語のことではない
知っている人は少ないかもしれないが、
languageパラメータは全く使われないパラメータだ。
これが利用される機会はただ一つ。
mb_send_mailを利用した時だけ
mb_send_mailは全く使わない関数なので、
このパラメータは存在意義がない。
mb_send_mailを使わない理由は後述しよう。 -
●internal_encodingは内部エンコードのことではない
先ほどの例の時にも書いたが、
PHPには内部エンコードという概念は存在しない。
ではmbstring.internal_encodingとは何なのか。
これは
mbstring関数のデフォルトエンコード
なだけである。
mb_convert_kanaなどのパラメータで、
変換元文字コードの指定がなかった時にだけ利用されるものだ。 -
SJISで利用した場合、
5C問題(「ソ」「表」などを記述するとパーサエラーが出る)が発生するわけだが、
internal_encodingをSJISにしても問題は解決しない。
これを解決するには--enable-zend-multibyteをつけてコンパイルし直し、
php.iniの設定で
mbstring.script_encoding = Shift_JIS
とする必要がある
(もちろんSJISは利用しないのが一番いいのだが。) -
●detect_orderは必ず指定する
detect_orderとは
文字コードの自動検出の優先順位
のこと。
何も指定しなければ「auto」というパラメータになるのだが、
このautoはかなりくせ者だ。
何も指定していない場合や、autoを指定すると「ASCII,JIS,UTF-8,EUC-JP,SJIS」の用に展開される。
が、マルチバイトを計る上でASCIIが一番先頭である時点ですでに欠陥である。 -
●http_outputは利用しない
http_outputについては二つ勘違いされやすいポイントがある。
一つは「指定すると自動で変換されて出力される様になる」
Σ( ̄ロ ̄; エッ!?チガウノ?
http_outputは指定するだけでは何も動作しない。
これは
mb_output_handlerが実行された時の出力エンコード
に過ぎない。
ob_start("mb_output_handler")
と指定されて初めて使われるのだ。 -
●mb_send_mailは使うな
マルチバイトのメールを送るからといって、
mb_send_mailを使っている人も多いかもしれない。
だが、このmb_send_mailは文字化けの元凶だ。
mb_send_mailは何の文字コードを何の文字コードに変換するかを指定することが出来ない。
なので、何の文字コードで入力を受け付けて、
ブラックボックスを通った後に何の文字コードで出力されるか全くわからないのである。
理由はmb_send_mailで利用される文字コードは、
languageパラメータに依存しているからだ。
languageにJapaneseと指定したところで、
ISO-2202-JPで送るのか、UTF-8で送るのか、またはSJISで送るのか全く不明だ。 -
それにマルチパートメールの場合は、
文字コードが一律でないことがある。
例えばDoCoMoのデコメール。
テキスト部分はJISだがHTML部分はSJISだ。
DoCoMOはSJIS Loveなためこのような仕様になっているが、
迷惑この上ない。
そんなことをせずに、
送信するメールをあらかじめ変換しておきmailに通す方が制御がわかりやすい。
mailも使い勝手が悪い関数なので、
PEAR::MailでSMTP送信するのが一番良い方法だろう。
-
-
19 Jun 07
-
15 Feb 07
-
14 Feb 07
Would you like to comment?
Join Diigo for a free account, or sign in if you are already a member.