表題の件ですが、
DBを直すのが早いと思われるのですが、PHPでの表示のさせ方をご教授頂けますと幸いです。
サーバはロリポップのレンタルサーバとなります。
mysqlはUTF-8でPHPもUTF-8です。
オープンソースの顧客管理システムと、
自分で開発したツールを連携させたいのですが、
顧客管理システムでのデータが下記のように文字化けしております。
ãªãªã—
こちらを日本語表示させたいのと文字コード等も教えて頂けますと幸いです。
また、一行だけですのでmb_convert_encoding()のような関数のような簡単に変換できる方法をご教授頂けますと幸いです。
よろしくお願い致します。
その後。。。。
どうやら
mysql_set_charset("utf8");
を
mysql_set_charset("utf-8");
に(ハイフン入れる)すると正常に表示されるようですが、
そのまま
mysql_set_charset("utf-8");
の設定でDBにUPDATE文を投げるとあのような文字化けをしてしまうようです。
utf-8に合わせるとDB側が文字化けをしてしまうのでどうしたもんか。。。
マークダウンもろくに使えずに申し訳御座いません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
select hex(..) した場合の文字化けのパターンから http://www.gcd.org/blog/2009/09/177/ で紹介されている誤ってUTF-8の文字列をclientのcharacter setの設定をlatin1にして書き込んで変に変換されてしまった状態であると考えられます。
SQL
1CREATE TABLE `t1` ( 2 `id` int(11) NOT NULL DEFAULT '0', 3 `message` text CHARACTER SET utf8, 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB DEFAULT CHARSET=latin1
PHP
1<?php 2 3$user = 'user'; 4$pass = 'pass'; 5 6$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 7 8$pdo->exec('set names latin1;'); // わざと間違えた状態にします。 9 10$sth = $pdo->prepare('insert into t1(id, message) values (:id, :message);'); 11$param = [ 12 ':id' => 1, 13 ':message' => 'ななし', 14]; 15$sth->execute($param);
上記のようなテーブルを用意してテスト用のプログラムを実行すると確かに同じ文字列が挿入されます。
text
1mysql> select * from t1; 2+----+---------------------+ 3| id | message | 4+----+---------------------+ 5| 1 | ãªãªã— | 6+----+---------------------+ 71 row in set (0.00 sec) 8 9mysql> select id,hex(message) from t1; 10+----+----------------------------------------+ 11| id | hex(message) | 12+----+----------------------------------------+ 13| 1 | C3A3C281C2AAC3A3C281C2AAC3A3C281E28094 | 14+----+----------------------------------------+ 151 row in set (0.00 sec)
従って、同じようにclient側の状態を間違ってlatin1にしてやれば、この逆の変換が行われて元と同じデータが読み出されます。
PHP
1<?php 2 3$user = 'user'; 4$pass = 'pass'; 5 6$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 7 8$pdo->exec('set names latin1;'); 9 10$sth = $pdo->prepare('select id, message from t1 where id = :id;'); 11$param = [ 12 ':id' => 1, 13]; 14$sth->execute($param); 15$row = $sth->fetch(); 16printf("%d, %s\n", $row['id'], $row['message']);
text
1$ php test2.php 21, ななし
同じやり方で無理矢理読み出すことは出来ると思います。
ただあきらかに間違った形でデータが格納されている状態ですので、顧客管理ソフトウェアの方の誤った文字コードの設定になっている問題を解決してからDBの中身も修正してきれいな状態にするのが本来は望ましいと思います。
投稿2015/12/28 05:37
総合スコア1175
0
mysqlに入って以下を直接実行してもだめでしょうか?
mysql>alter table messages default charset=utf8;
投稿2015/12/28 04:36
総合スコア386
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
他の方もおっしゃっている通り、DBを直すのが間違いないです。
が、もし単なる文字コードの問題で表示さえできれば取り急ぎOKであれば以下の関数をお試しください。
文字コードを判別して返します。
PHP
1function hoge($str){ 2 foreach(array('UTF-8','SJIS','EUC-JP','ASCII','JIS') as $charcode){ 3 if(mb_convert_encoding($str, $charcode, $charcode) == $str){ 4 return $charcode; 5 } 6 } 7 8 return null; 9}
投稿2015/12/17 14:41
編集2015/12/17 14:42総合スコア56
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/18 01:12 編集
2015/12/18 01:48
2015/12/18 02:11
2015/12/18 04:03
2015/12/25 01:17
2015/12/25 05:06
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/18 01:07
2015/12/18 01:50
2015/12/18 03:59 編集
2015/12/18 04:09
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/28 06:30