文字コードの判別ができない
現在、よくわからない現象が発生したので
ここで質問させていただきます。
原因などわかる方いらっしゃいましたらご教授ください。
また、情報不足や説明不足などありましたらご指摘ください
補足させていただきます。
--------------現象--------------
特定の文字にて、mb_detect_encodingが正常な文字コードを返してこない
以下、簡略化したソースになります。
// 説明のため簡略化しているので、
// このソースは正常に動作しない可能性があり
// また同様の現象も発生しないと思います。
// DBからデータを取得
// DB接続はPEARを使用しています。
// $rsはクエリを投げ終わっているとします。
$row =& $rs->fetchAll( MDB2_FETCHMODE_ASSOC );
// この時点で、文字コードはEUC-JPとなっています。
// 取得したデータをブラウザ出力のため、エンコードする
function_hoge( &$row ); // 関数の引き渡す
// 以下関数の内容抜粋
Function function_hoge( &$array )
{
// 配列の場合と配列じゃない場合があるので注意すること
If ( Is_Array( $array ) )
{
// 配列の場合、Foreachでループ
Foreach ( $array as $key => $val )
{
// 連想配列の可能性があるので再度配列かチェック
If ( Is_Array( $array[$key] ) )
{
// この場合、再帰処理を行う
function_hoge( &$array[$key] );
}
Else
{
echo 'A===='.function_encode( $val );
$array[$key] = function_encode( $val );
echo 'B===='.function_encode( $val );
}
}
}
Else
{
// この場合、配列ではないので普通にエンコードしておく
$array = function_encode( $array );
}
return $array;
}
Function function_encode( $strIn )
{
$strOut = $strIn;
$strEncode = mb_detect_encoding( $strIn, 'EUC-JP,UTF-8,SJIS' );
// 返還前の文字コードと変換後の文字コードが違う場合のみ変換する
If ( StrToUpper( $strEncode ) <> 'UTF-8' )
{
$strOut = mb_convert_encoding( $strIn, 'UTF-8', $strEncode );
}
return $strOut;
} // function_encode
簡単に書くと、こんな感じの処理になっております。
※変な箇所とかありますが、あまり気にしないでください。
ほかの処理とかもあるので、走り書きです。申し訳ございません。
このとき、レコードセットに格納されている値は最初はEUC-JPとなっています。
カラムに[hoge_name]というフィールドがあるのですがそこにはいろいろな文字列が格納されています。
ほかのカラムは英数字のみしか格納されていないので文字コードは問題ないのですが
この[hoge_name]がちゃんとエンコードされたりされなかったりという状況です。
具体的に、以下のデータになります。
DBのデータが以下の場合
hoge_id hoge_name
1 経理
2 業務
3 法務
のようにデータがあった場合、3の法務だけ上記コードのA、Bの箇所でエンコードが
???な状態です。
1、2のデータはAの箇所でEUC-JPとなり、Bの箇所でUTF-8となり正常にエンコードされるのですが
3の法務の場合だけ、Aの箇所でUTF-8、Bの箇所でUTF-8となってしまいます。
上記処理で、変換したい文字コードと実際の文字コードが同じ場合には
エンコードしないようになっているのですが、3の法務は実際にはEUCのため
出力時に文字化けしてしまいます。
ただし、これをもっと簡単に記述したとして
mb_detect_encoding( '法務', 'EUC-JP,UTF-8,SJIS' );
のように、DB取得ではなく直接記述した場合には問題ありません
このような現象をご存知、または原因がわかる方いらっしゃいましたらお教えください。