現在のページ

HOME » ID-Blogger » テクノロジー » トラブルシューティング » PHP+MySQL+UTF-8で文字化け回避

PHP+MySQL+UTF-8で文字化け回避

なんだかんだとWebの世界もグローバル化の波を受けて、「これからの文字コードはUTF-8が標準ですよ!」と言わんばかりに突き進んでいるような気がします。UTF-8だと日本が3バイト扱いになってデータ容量が1.5倍になってしまうデメリットもありますが、Google系API関係やMovableTypeをはじめとした海外産にこれだけ囲まれるようになってくると、Webサイトの構築時には初期段階からUTF-8で制作した方が親和性が高いようです。
という事で弊社でも文字コードはUTF-8で構築してみたのですが、PHPを絡めて制作すると文字化けするという問題が発生しました。

例えばフォームの内容をPHPで受けるようなページを制作したとします。例えばこんなカンジで

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="ja" />
<title>PHP送信テスト</title>
</head>
<body>
<? echo $_POST['aaaa']; ?>
<form action="" method="post">
送信テスト<input name="aaaa" type="text" value="" /><input type="submit" value="送信" />
</form>
</body>
</html>
送信ボタンを押すとフォームの内容がそのまま表示されるワケですが、UTF-8ベースのXHTMLでPHPを絡めてあると、日本語を入力した際に吐き出されるデータが「???????」という風に化けてしまうのです。

ググってみると同じようにこの問題にぶつかった方は結構多いみたいですね。原因はサーバで扱うPHPの内部処理の文字コードが、元々EUCをベースである事に起因している様です。
回避方法はPHPのフォーム情報の受け取り部分の前に以下のように追記して、

<?
mb_language("uni"); <--追加
mb_internal_encoding("utf-8"); <--追加
mb_http_input("auto"); <--追加
mb_http_output("utf-8"); <--追加
echo $_POST['aaaa'];
?>
内部処理の文字コードをUTF-8に変更してから受け取る様にしてあげればよいようです。


さらに今回制作したWebサイトではMySQLデータベースも併用していたので、コチラもUTF-8に対応するように変更します。
照合順序の文字セットを「utf8-unicode-ci」で選択しておけば間違いないようです。後々面倒になりますので、データベースの構築前に設定しておくことをオススメいたします。MySQLの管理は「PHPMyAdmin」で行いましたのであしからずw

PHPからMySQLに接続する際にはこんなカンジで別ファイルに書いておいてrequire文で呼び出したりすると思います。接続前にUTF-8を使ってますよと宣言しておきましょう。

<?
mb_language("uni");
mb_internal_encoding("utf-8");
mb_http_input("auto");
mb_http_output("utf-8");

$db=mysql_connect("DB鯖","接続ID","接続パスワード");
mysql_query("SET NAMES utf8",$db);
mysql_select_db("DB名");
?>


ちなみに”\”とか”〜”とか入力するとデータベース上ではやっぱり「??????」と文字化けしちゃってますが、取り出して出力するとちゃんと表示されるのであまり気にしない方向でm(_ _)m

概ねこんな所で回避できると思いますので、文字化けで悩んだ方は参考にしてください♪

トラックバック

このエントリーのトラックバックURL:
http://www.infinity-dimensions.com/blog/mt-tb.cgi/247

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

コンテンツメニュー

カテゴリー

Add