文字エンコーディングの変換

設定オプションによる設定

設定オプションで文字エンコーディングを明示することで、文字化けを解消できることがあります。

default_charset

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

マルチバイト文字列の言語設定で、

mbstring.language = Japanese

のように日本語を設定することは、文字化けとは無関係です。

mb_convert_encoding()

文字エンコーディングを変換する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

mbstringで使用可能なエンコーディング (一部)

$to_encoding$from_encodingには、以下のようなエンコーディングを指定できます。

  • UTF-8
  • UTF-7
  • ASCII
  • EUC-JP (EUC-JP)
  • eucJP-win
  • SJIS (Shift JIS)
  • SJIS-win
  • JIS
  • ISO-2022-JP (JIS)

これはサポートされるエンコーディングの一部であり、完全なリストは

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

iconv()

string iconv (
    string $in_charset ,  // 入力文字セット (エンコーディング)
    string $out_charset , // 出力文字セット (エンコーディング)
    string $str           // 変換する文字列
    )
PHP: iconv - Manual

$out_charsetにキーワードを追加することで、指定の文字セットで変換できない場合の挙動を制御できます。

  • 文字セット//TRANSLIT … 似ている別の文字に置き換える
  • 文字セット//IGNORE … 切り捨てる
  • 文字セット … 変換の処理を打ち切る

キーワードを指定せず変換が打ち切られたときには、「Notice: iconv(): Detected an illegal character in input string in …」のように出力されます。

PHPのマニュアルから検索