PHPで作成している自分用の
オンラインブックマークサイト、BuKuMa! ですが、
MySQLのバージョンが4.0と古かったので、5.5にバージョンアップすることに。
でないと、他のデータベースを新規作成できないという、
さくらインターネットの仕様があるためです。
そこで、この機会に、文字コードをEUC-JPからUTF-8に変更しようと思いたち(理由は後日)、
いろいろいじって見ました。
PHP+MySQLの勉強がてら。
しかし、なんか初めで躓いて閉まったので、忘備録として残しておきます。
書きかけです。 ネットで検索してみると、
さくらインターネット+PHP+MySQL+UTF-8で文字化けするというのが、
たくさん出てきます。
私ももれなく該当しました。
まず、MySQLのデータベースのエクスポートをし、バックアップをとります。
といらえず、phpMyAdminの初期設定のままエクスポート。
そして、「テキストエディタ」に貼付けておきました。
(文字コードを簡単に変換できるもの)
そのあと、インポートすればいいだろう・・・と、たかをくくっていたのですが、
結構大変でした・・・。
そして、データベースを、さくらインターネットのコントロール画面で削除。
あっさり消えました。
さて、インポートとなるのですが、
ここで、UTF-8にすることを思い出す。
そして、新規データベースを作成で、新しいサーバを確認し、
再びphpMyAdminへ。
MySQL 接続の照合順序:utf8_general_ciにとりあえず、設定。
そして、インポートをファイルを読み込んでする方法を採用し、
一気にインポート・・・したのですが、エラーが出ます。
まず出たのは、「すでにデータベースがあります」というもの。
そりゃそうだ、と思い、create文をコメントアウトして、(-- をつけるだけですが)
インポートしなおしました。
そして、サイトを開いてみると、ページ全体が文字化け。
ひどいものでした。
そこで、まず、htmlのメタタグのEUC-JP指定になっていたのをUTF-8に指定。
そして、phpファイル自体を、まだエンコードしていなかったので、
テキストエディタで変更。utf-8に。
そうしてもう一度みてみると、自分が書いた部分はOKだったのですが、
MySQLからデータを引っ張ってきている部分だけ、文字化け。
しかも、半角英数字のところは記述されていますが、
日本語文字が、?????????????となっています。
文字コードの変更スクリプト部分がいけないのだと思い、
まずは、php.iniファイルを確認することに。
(最初にしておくべきでした)
と言っても、さくらインターネットでは、変更するところだけかけばよいので便利。
http://www.yamada-lab.org/doc/win/mysql5/utf8/index.html こちらを参考に、
mbstring.internal_encoding = UTF8
mbstring.http_output = UTF8
default_charset = "UTF8"
を追加。
なぜか、最後の行だけ""をつけていたのですが、つけなくてもOKのようです。
BuKuMa! は、下記の本の15-5リンク集を改造したものです。
PHPによるWebアプリケーションスーパーサンプル 第2版/西沢 直木 ¥3,990
Amazon.co.jp
しかし、この本では文字コードはEUC-JPが前提となっているようでして、
UTF-8にするための方法がいまいちわかりませんでした。
一応、設定する部分はあり、そこにUTF-8と書いたのですが、うまく行かず。
というか、まず、エラーがでて、
phpファルのコードで、MySQLのデータベースへの接続の所でおかしいことが発覚。
ネットでいろいろ探していたら、
下記のようにするとよいとありました。
mb_language("uni"); //<--追加
mb_internal_encoding("utf-8"); //<--追加
mb_http_input("auto"); //<--追加
mb_http_output("utf-8"); //<--追加
echo $_POST['aaaa'];
?>
http://www.infinity-dimensions.com/blog/archives/000114.html そこで、
// =================================================
// ----- db接続
// =================================================
function db_conn() {
mb_language("uni");
mb_internal_encoding("utf-8");
mb_http_input("auto");
mb_http_output("utf-8");
$conn = mysql_connect(DBSV, DBUSER, DBPASS) or die("接続エラー");
mysql_query("SET NAMES utf-8",$conn);
mysql_select_db(DBNAME, $conn);
return $conn;
}
// =================================================
// ----- SQL実行
// =================================================
function db_query($sql, $conn) {
mb_language("uni");
mb_internal_encoding("utf-8");
mb_http_input("auto");
mb_http_output("utf-8");
mysql_query("SET NAMES utf8",$conn); //ここは適当
$res = mysql_query($sql, $conn);
return $res;
}
と、編集。ひたすらUTF-8だよと主張するのですね。(^^;)
そうしたら、エラーが消えました。よし。文字化けを何とかせねば。
phpファイルをまた開いて編集。
mb_detect_encoding($string, "EUC-JP, SJIS")
として、エンコードを確認するところがあったのですが、
イマイチよくわからず、ここのエンコード名を色々変えて実験。
・・・・すべて失敗。
なので、最終的には、
// =========================================================
// データをSQL用に変換
// =========================================================
function cnv_sqlstr($string) {
// 文字コードを変換する
//$det_enc = mb_detect_encoding($string, "EUC-JP, UTF-8");
//if ($det_enc and $det_enc != ENCDB) {
// $string = mb_convert_encoding($string, ENCDB, $det_enc);
//}
// バックスラッシュを付加する
$string = addslashes($string);
return $string;
}
と、このへんの文字コードを変換する部分を
すべてコメントアウトして、回避。
もう一箇所、同じようなところも同様に。
また、管理画面のphpファイルも同様に。
そうしたら、表示される文字がかわり、うまくいきました。
でもこのとき、実はまだエラーが出ていて、
unexpected $end
と出ていました。
こちら
http://okwave.jp/qa/q2516204.html をみて、なるほど、と思い、ソースをくまなく検査。
if文の閉じる"}"が一つなくなっていました。
これでよし!と思ったのですが、もう一つエラーが。
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent~~~
これには参りましたが、
このままこのエラーをコピペして検索したら下記がヒット。
http://www.6krpm.jp/blog/web/php/2008/06/21/1306/ よく読んでみると、「UTF-8N」とありました。
そうか、BOMの有無だったんですね。
ファイルをすべて、UTF-8からUTF-8Nに変更。
そうしたら見事。
なんとか、UTF-8Nバージョンの、
BuKuMa! が出来ました。
ちょっとマニアックな記事ですいません。
でも、検索結果を見るかぎり、さくらインターネットで、UTF-8で文字化けというキーワードで、
たくさん出てくるので、参考になったという方がいたらいいなと思います。
では、なぜ、あえてUTF-8にこだわったかというと、
php.iniの設定でUTF-8をデフォルトにしないといけない「もの」を、
サーバにインストールしたかったからです。
それはまた後日。。。
いつも応援、ありがとうございます! Ranking Click!→にほんブログ村 にほんブログ村 にほんブログ村