原因はたぶん、mysqlのCHARACTER SETがeucなのにutf-8に変換して格納してしてしまっているからかな?
現在set names utf-8して、すべての取り扱いをutf-8にしてしまっています。
mb_convert_encoding($str, "utf-8", "auto");ページコードもutf-8です。
サーバのデフォルトの設定がいじれないという事だけでしたら、デフォルトがeucだとしてもデータベース、テーブルあるいはカラムごとにキャラクタセットを指定でます。MySQL 4.1用ですが、日本語のドキュメントもあります。
ご利用のパッケージが MySQL 4.1 以上という前提で回答します。
default-character-set = utf8
に設定してください。手順は「MySQL で、キャラクタセットを指定してデータベースをインポートする方法」を参照してください。
MySQL側がutf-8格納設定されていれば、mb_convert_encoding($str, "utf-8", "auto"); は不要です。auto指定すると、かえって文字化けの原因になります。
mb_internal_encoding('utf-8') は指定してください。
ごめんなさい注釈不足で。DBがutf-8なら問題ないです。
ただ現象のでているレンタルサーバーが残念なことにsjisかeucしか設定できないんです。
ここらへんは入ってます。
mb_language('Japanese');
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
ただ現象のでているレンタルサーバーが残念なことにsjisかeucしか設定できないんです。
MySQLがsjisかeucしか設定できないということですね。
それであれば、MySQLをeucに設定し(PHPはsjisで不具合が出ることがあるので)、
HTML/PHP も euc-jp で統一するのが無難です。
どうしても HTML/PHP 側を utf-8 にしなければならないのであれば
mb_convert_encoding($str, 'euc-jp', 'utf-8') で MySQL 用のデータを生成し、
MySQLから受け取ったデータは mb_convert_encoding($str, 'utf-8', 'euc-jp') でデコードしてください。
一応ページコードはutf-8からは動かしたくないです。
mb_convert_encoding($str, 'euc-jp', 'utf-8')逆かな?
そうですね。。。
やはりこれが一番の近道ですか。。。
configで弄れるようにしておいたのですが、動いているようだったので気がつきませんでした。
次回のメンテのときにでもダンプして差し替えを試みます。
>特定の文字だけが
DBに格納する前に、特定の文字だけを別の文字に変換して格納。
取り出すときは、逆の操作をして、元の文字列に戻す。
HTMLユニコードに変換してもよいかも。
サーバのデフォルトの設定がいじれないという事だけでしたら、デフォルトがeucだとしてもデータベース、テーブルあるいはカラムごとにキャラクタセットを指定でます。MySQL 4.1用ですが、日本語のドキュメントもあります。
そうですね。
データベースのクリエイトコマンドもssh経由では禁止されているので変更できないのですが、
テーブルにキャラコードつけておけば問題なかったのかもしれませんね。
http://dev.mysql.com/doc/refman/4.1/ja/charset-table.html
ALTER TABLE table_name DEFAULT CHARACTER SET utf-8
こんな感じかな。
いずれにしろ一回データをダンプしないとだめそうですね。
ありがとうございました。
そうですね。
データベースのクリエイトコマンドもssh経由では禁止されているので変更できないのですが、
テーブルにキャラコードつけておけば問題なかったのかもしれませんね。
http://dev.mysql.com/doc/refman/4.1/ja/charset-table.html
ALTER TABLE table_name DEFAULT CHARACTER SET utf-8
こんな感じかな。
いずれにしろ一回データをダンプしないとだめそうですね。
ありがとうございました。