SATOXのシテオク日記 このページをアンテナに追加 RSSフィード Twitter

最近日記一覧(30)

[PRG]Visual Studio Installerにインストール環境条件をつける
[メモ]スマートフォンは5年以内に時代遅れになる?
[間違い]クリミナルガールズ
[間違い]東京ねこなかまさんのサイト
[PRG]全天球動画編集前のファイル仕分けバッチ作ってみた
[間違い]USB3.0リンクケーブル製品ページ
[私信]「言う」と「いう」
[駄文]Windows10アップグレードの抑止方法
[駄文]韓国「盗んだ仏像は取りに来たら返す」
[私信]7/15 Amazon PRIME DAY(プライムデー)に何が起こる?
[私信]カレー味、ゆず味
[メモ]2020年にフォーミュラEはF1を上回る
[PRG]Android+Eclipse+NDKの問題
[F1]2014第13戦イタリア決勝結果
[F1]2014第13戦イタリア予選結果
[ゲーム]ドラクエ無双がPS4で登場
[駄文]はやぶさ2機体公開
[私信]いるいる「24時間テレビは偽善者」と言いたい人
[F1]マックス・フェルスタッペン、ドーナツターン失敗
[F1][動画]フォーミュラ1VSフォーミュラE
[駄文]Seageteが8TB HDDをサンプル出荷
[F1]2014第12戦ベルギー決勝結果
[F1]2014第12戦ベルギー予選結果
[F1]フォーミュラE徹底ガイド観た
[F1]アンドレ・ロッテラーはケータハムに身を置くつもりはない模様
[F1]小林可夢偉、ケータハムのシートを失う
[F1]フォーミュラE最終テストタイム
[F1]佐藤公哉、Auto GPでシリーズチャンピオン獲得
[動画]アザラシとサーフィン
[駄文]ハイスコアガール著作権問題

最新トラックバック一覧

最新コメント一覧

1. 10/05 nor
2. 10/05 鉄板
3. 01/08 やまさん
4. 01/08 やまさん
5. 10/05 まぁぶぅ
6. 09/29 かわむら
7. 06/27 satox
8. 06/27 chap-chap3
9. 07/22 satox
10. 07/22 よこたん

SATOXのむにむにアンテナ

最近の言及URL

シテオクカウンタグラフ

satoxのシテオクカウンタ

一生どうでしょうします!

連絡先アドレス

文句、苦情、愛の告白、
日常の愚痴、応援のお便り、
週報送り先などは以下の通り。

その他

■QRコード(URL):
SATOXのシテオク日記 for mobile
SATOXのシテオク日記は、携帯向けに最適化された内容で閲覧することができますぞ。

将来は猫になりたいSATOX(さとっくす)ことダメな人が、シテオクな日記を綴ったり綴らなかったり。
F1伊集院光水曜どうでしょう猫好きぷに絵描き。お仕事はゲーム関連のプログラマやってます。
follow us in feedly My Yahoo!に追加 Subscribe with livedoor Reader Bloglinesで閲読登録

2012-09-29(Sat)

みたな

[]PHP+MySQLのうんざり日本語文字化け対策

この手の話題はもううんざりしているし、ある種の技術者にとっては当たり前で自明の理というお話だと思いますが、SATOXが3時間ほど悩んだので解決方法をメモ的に記事にしておきます。

たぶん、もっとスマートなやり方とかエスケープしろとかはあるとは思いますが……。

(ちなみに、PHP 5.2.17を使ってます)

 

■前提と問題点

目的としてはPHPソースからMySQLのデータベースにアクセスし、情報の一覧をJSON形式で出力しようと思いました。

で、日本語文字を出力しようとしたところ、「????」と文字化けしてしまったというあるある系の問題が発生。うんざりです。


ひとまず基本的なお話として、データベースもフィールド文字設定もUTF-8に設定しました。

これで面倒な文字化け問題は起きないと思っていたのですが……。

 

で、まずはUTF-8で保存したPHPソースから、直に日本語を出力して大丈夫なことを確認。

まぁ以下のようなコードですな。とりあえずJSONの事は忘れます。

<?php
header('Content-type: text/plain; charset=UTF-8');
header('Content-Transfer-Encoding: binary');

echo "日本語OK\n";
?>

乱暴だけど、バイナリで無変換。PHPソースがUTF-8なので大丈夫だった。

以下、実行結果。(Firefox

日本語OK

 

■データベースから取得した文字を表示したらダメだった

で、次にデータベースとテーブル、NIHONGOというUTF-8の日本語フィールドを作成して、表示しようとしてみました。

ソースはこんな感じ。

<?php
$sql = mysql_connect("DBURL", "DBユーザ名", "DBパスワード");
mysql_select_db("DBデータベース名", $sql);

$query = "SELECT * FROM SQLテーブル名";
$result = mysql_query($query);

header('Content-type: text/plain; charset=UTF-8');

while ($row = mysql_fetch_array($result)) {
	 echo $row["NIHONGO"] . "\n";
}
?>

ところが、文字化けしてしまったんです。

 

以下、実行結果。

???OK

???????

バイナリにしてもダメでした。DBもUTF-8なのに誰が勝手に変換しやがるのか。

 

■おまじないクエリを入れたら問題解決

というわけで、「UTF-8を使いますよ」との設定が必要です。

データベース接続後にSQLクエリの「SET NAMES」でUTF-8設定をしてみました。

<?php
$sql = mysql_connect("DBURL", "DBユーザ名", "DBパスワード");
mysql_select_db("DBデータベース名", $sql);
mysql_query('SET NAMES utf8', $sql ); // ←これ

$query = "SELECT * FROM SQLテーブル名";
$result = mysql_query($query);

header('Content-type: text/plain; charset=UTF-8'); 

while ($row = mysql_fetch_array($result)) {
	 echo $row["NIHONGO"] . "\n";
}
?>

以下、実行結果。

日本語OK

たけやぶやけた

してやったり。

 

■SET NAMESに問題あり?

ググってみると、SET NAMES設定には問題があるような記事が見つかります。

そのはっきりとした理由はよく理解できませんでしたが、PHP4、PHP5的な変遷を考えると「クエリで解決するのではなく、APIで解決しろ」という事だと勝手に解釈。

PHP 5.2.3以降ではクライアント文字設定を行うmysql_set_charset という関数があるので置き換えてみました。

これでも大丈夫でした。

<?php
// mysql_query('SET NAMES utf8', $sql );
mysql_set_charset('utf8'); // ←変更
?>

 

さて、JSONの話がすっ飛んでいますが、JSONで出力するなら、コンテントタイプは「application/json」がより正確ですかね。JSONはUTF-8がデフォルトです。

結論。

「mysql_set_charset('utf8');」しなさい、と。

ぴゅあちゃんぴゅあちゃん 2013/03/24 00:42 はじめまして〜うちもしてやったりでした!
うちの場合はeuc-jpでいけました

satoxsatox 2013/03/24 16:17 どうも始めまして。
文字コード、やっかいですよね。
お役に立てたのであればよかったです!

青い空青い空 2013/04/17 03:47 全く同じです。
助かりました。
UBのEUCコードからの移行 SET NAMES〜は、経験してましたが
DB、内部ファイルも全てUTF8にして、何で化けるんだろ?

satoxsatox 2013/04/17 04:30 すべてUTF-8なのに化けるのはよく分かりませんね。
ASCII文字で十分な方達の陰謀だと勝手に思っております。

capucapu 2013/05/19 19:09 始めまして。

他の方法は:
config/database.php の中に、'encoding' => 'utf8'を付けば行けますよ。

public $DBデータベース名 = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => '127.0.0.1',
'port' => 3306,
'login' => 'root',
'password' => '',
'database' => 'DBデータベース名',
'encoding' => 'utf8' // <−−これ
);

satoxsatox 2013/05/19 19:19 どうも始めまして。
他の方法についてのご紹介ありがとうございます。
ちょっと調べてみた所、どうもCakePHP依存の方法みたいですね。
CakePHPを利用する場合は参考にしてみたいと思います。

かわむらかわむら 2015/08/13 19:04 すごくはまってしまっていたので、非常に助かりました。
ありがとうございました!

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

200403040506070809101112
2005010203040506070809101112
2006010203040506070809101112
2007010203040506070809101112
2008010203040506070809101112
2009010203040506070809101112
2010010203040506070809101112
2011010203040506070809101112
2012010203040506070809101112
2013010203040506070809101112
2014010203040506070809
201503060708091012
201601

  • satox2016-01-20
  • あっぷ
  • ぬも
  • miteru
  • みてる
  • ピックアップ
  • おばちゃん
  • smilecat
  • ぎょ
  • ぺろりん
  • みる
  • みてる
  • satox2015-03-25
  • 吸う
  • だるい
  • ねこだまり
  • <●><●>
  • 夜景
  • ふいふい
  • gyo
  • ごあいさつ
  • ずるーん
  • すくっ
  • 男爵
  • ぬぬ
  • 胸を借りる
  • ぞうしょく
  • マッシュルーム
  • hirune
  • 寝る子=猫
  • じゆう
  • ねこよけない
  • miteru
  • 涼しい
  • 呼んだ?
  • 群れ
  • おもいかね
  • いっそ飲んでくれ
  • 見つかった!
  • ゆびさしかくにん
  • 対峙
  • だらあん
  • 真ん中分け
  • ベテランの守備
  • 開眼
  • みざる
  • パパラッチ
  • kinenn
  • ずぶぬれ
  • ねこ
  • ねこだまり
  • みてる
  • Twitterに投稿
  • きょうだい
  • ぐーすか
  • だらしないねこ
  • 花占い
  • 店番
  • ちっさいわー
  • 骨肉の
  • めっ
  • キャンプだほい
  • 先客が
    (c) 2004-2014 SATOX All Rights Reserved.
Connection: close