i のすべての投稿

php.iniファイルのマルチバイト設定について②mbstring.internal_encoding

URLエンコード(urlencode関数)でエンコードしたものを、デコードしてもどうしても文字化けする。

色々調べた結果、「php.iniファイルが悪さをして」との記述からphp.iniファイルを見直す。

mbstring.internal_encoding

内部文字エンコーディングを設定するとのこと。
これをSHIFT-JISに変更したらとりあえず問題が解決した。

現在運営中のサイトはサイト自体はshift-jisで運営されている。
当然HTMLファイルもshift-jisで作成されている。

が、データベースはUTF-8で稼働している。

PHPプログラムもUTF-8で作成している。
なので入力時はSHIFT-JISからUTF-8へ、出力時はUTF-8からSHIFT-JISへいつもmb_convert_encodingしている。
なぜこのようになってしまったかは置いといて、
ということは内部文字エンコーディングを変更すると、
データベース書き込み時に変化が出そうだから変えるのはマズイのかな・・・
これはためしてない。
(今後はデータベースやPHPファイル、HTMLすべてUTF-8で統一したい…)

とりあえず、urlencodeする前にSIFT-JISにmb_convert_encodingして、
GETパラメータで受け取った後、再度UTF-8からSHIFT-JISにmb_convert_encodingしたら表示が文字化け解消。

参考
php.iniの文字コードの設定

php.iniファイルのマルチバイト設定について①default_charset

URLエンコード(urlencode関数)でエンコードしたものを、デコードしてもどうしても文字化けする。

色々調べた結果、「php.iniファイルが悪さをして」との記述からphp.iniファイルを見直す。

default_charset

default_charsetはデフォルトの文字コードのことではないらしい。

「出力時にHTTPヘッダとして送信する文字コード名」

とのこと。

現在使用中のCPIサーバーには以下の記述があった。

; PHP’s built-in default is text/html
default_mimetype = “text/html”
;default_charset = “iso-8859-1″

この記述を変更することによるhttpヘッダーの値の変化を確認。

1.default_mimetype = “text/html”のみ。(上記の状態。)

結果:Content-Type: text/html

2.default_charset = “UTF-8″(default_charsetのコメントをはずし、UTF-8を指定。)

結果:Content-Type: text/html; charset=UTF-8

3.default_mimetype及びdefault_charset両方コメントアウト。

結果:Content-Typeは出力されず

参考
HPのマルチバイト環境と文字化けに関する問題のまとめ