設定オプションで文字エンコーディングを明示することで、文字化けを解消できることがあります。
default_charsetは、文字セットを指定しなかった場合に出力されるContent-Typeの文字セットです。たとえば、
default_charset = "UTF-8"
と設定しておくと、レスポンスヘッダに
Content-Type: text/html; charset=UTF-8
のように追記されます。PHP 5.6.0以降は既定で"UTF-8"
と設定されていますが、それ以前は空欄または"iso-8859-1"
となっており、それが原因で文字化けすることがあります。default_charset - PHP: コア php.ini ディレクティブに関する説明 - Manual
マルチバイト文字列の言語設定で、
mbstring.language = Japanese
のように日本語を設定することは、文字化けとは無関係です。
文字エンコーディングを変換するmb_convert_encodingは、文字エンコーディングを正しく指定しないと文字化けすることがあります。
string mb_convert_encoding ( string $str, // 変換する文字列 string $to_encoding // 変換後の文字エンコーディング [, mixed $from_encoding ] // 変換前の文字エンコーディング )PHP: mb_convert_encoding - Manual
変換前の文字エンコーディング、from_encodingを指定しなかった場合には内部文字エンコーディングがそれとみなされるため、これは省略すべきではありません。また'auto'
と指定した場合には、日本語環境では'ASCII,JIS,UTF-8,EUC-JP,SJIS'
と指定したものとみなされます。mbstring.detect_order - PHP: 実行時設定 - Manual
$to_encodingと$from_encodingには、以下のようなエンコーディングを指定できます。
これはサポートされるエンコーディングの一部であり、完全なリストは
print_r( mb_list_encodings() );
とすることで得られます。
PHP 8.2以降、"QPrint (Quoted-Printable)"や"HTML entities (HTML-ENTITIES)"などは非推奨となっており、それぞれquoted_printable_decode()やhtml_entity_decode()を用いることとされています。
、、などの環境依存文字に対しては、SJIS
ではなくSJIS-win
を指定します。Windowsの機種依存文字 - CyberLibrarian
string iconv ( string $in_charset , // 入力文字セット (エンコーディング) string $out_charset , // 出力文字セット (エンコーディング) string $str // 変換する文字列 )PHP: iconv - Manual
$out_charsetにキーワードを追加することで、指定の文字セットで変換できない場合の挙動を制御できます。
キーワードを指定せず変換が打ち切られたときには、「Notice: iconv(): Detected an illegal character in input string in …」のように出力されます。