検出順序によって結果が変わるのでなるべく変わらないパターンのメモ
検出方法
$string = 'えんこーど';
// エンコード検出
$expected_encode = mb_detect_encoding($string, ['ASCII', 'ISO-2022-JP', 'UTF-8', 'EUC-JP', 'SJIS'], true);
追記
使用する際にはSJISでも漏れる場合があったので決まらなかったらSJISにする処理を入れたら良さそう。
$from_encoding = mb_detect_encoding($encoded_string, ['ASCII', 'ISO-2022-JP', 'UTF-8', 'EUC-JP', 'SJIS'], true);
if ($from_encoding === false)
{
$from_encoding = 'SJIS';
}
mb_convert_encoding($encoded_string, 'UTF-8', $from_encoding);
確認
$internal_encoding = mb_internal_encoding();
$string = 'えんこーど';
$code_list = ['ASCII', 'ISO-2022-JP', 'UTF-8', 'EUC-JP', 'SJIS'];
foreach ($code_list as $code)
{
$encoded_string = mb_convert_encoding($string, $code, $internal_encoding);
if ($encoded_string === false)
{
continue;
}
var_dump('内部エンコーディング:'.$internal_encoding);
var_dump($code.'に変換');
var_dump('エンコーディング検出:'.mb_detect_encoding($encoded_string, $code_list, true));
}
結果
string(38) "内部エンコーディング:UTF-8"
string(14) "ASCIIに変換"
string(36) "エンコーディング検出:ASCII"
string(38) "内部エンコーディング:UTF-8"
string(20) "ISO-2022-JPに変換"
string(42) "エンコーディング検出:ISO-2022-JP"
string(38) "内部エンコーディング:UTF-8"
string(14) "UTF-8に変換"
string(36) "エンコーディング検出:UTF-8"
string(38) "内部エンコーディング:UTF-8"
string(15) "EUC-JPに変換"
string(37) "エンコーディング検出:EUC-JP"
string(38) "内部エンコーディング:UTF-8"
string(13) "SJISに変換"
string(35) "エンコーディング検出:SJIS"