人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPでMySQLのデータをファイル(CSV)に出力する処理を仕様とすると英語などは正常に出力されるのですが、中国語など一部の言語のみ、「姐妹」が「姐妹」(半角)などと正常に出力されません。

phpMyAdminなどで確認すると「姐妹」でデータは格納されているのですが、ブラウザで出力されると「姐妹」と正常に表示されます。

PHPで正常に「姐妹」とファイルに出力するにはどうすればよろしいでしょうか?

よろしくお願いいたします。



●質問者: usjma
●カテゴリ:ウェブ制作
✍キーワード:CSV MySQL PHP phpMyAdmin データ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● uradiet
●0ポイント

データが HTML エンコードされたままデータベースに格納されているようです。

HTML デコードをかけてあげましょう。

http://php.plus-server.net/function.html-entity-decode.html

ブラウザだと HTML エンコードされた文字は自動でデコードするので正常に表示されます。

◎質問者からの返答

ありがとうございます。

html_entity_decode()では、デコードされませんでした。


2 ● pahoo
●0ポイント

以下の確認をお願いします。

  1. 「ブラウザで出力されると「姐妹」と正常に表示されます」というのは、phpMyAdmin で表示させると正常に表示されるという意味ですか? そのとき、phpMyAdminの文字コード設定は何になっていますか?
  2. PHP の環境変数 mbstring.internal_encoding, mbstring.language は何を設定していますか?
  3. PHP で中国語を扱う場合、文字コード BIG5(繁体中国語)はサポートしていますが、GB2312(簡体中国語)はサポート外です。動作はするとは思いますが‥‥。
◎質問者からの返答

ありがとうございます。

1,ブラウザで出力されるというのは、私の作ったPHPで何もせずに出力したときで、phpMyAdminでは

「姐妹」と表示されます。

3,mb_convert_encodingで、BIG5からのエンコードをしてもだめでした。

文字コード設定はすべてUTF8にしています。

しかし、このデータは他のDBから移動したもので元々のDBの文字コードはlatin7でした。

また、このDBには中国語以外にもハングル語や中東系の言語や日本語、英語、仏語など様々な言語が入っております。


3 ● pahoo
●0ポイント

#2のコメント:

しかし、このデータは他のDBから移動したもので元々のDBの文字コードはlatin7でした。

また、このDBには中国語以外にもハングル語や中東系の言語や日本語、英語、仏語など様々な言語が入っております。

latin7で実装されているなら、マルチバイト文字を格納することができないので、データとして "&#文字コード;"(半角)で格納されているのは定石です。

さらに、さまざまな言語が混在しているなら、この実装方法をとるのが妥当です。

そして、phpMyAdmin でも、マルチバイト文字に変換されずに表示されるのは正常です。


PHPで、マルチバイトも字の形で表示させたいなら、下記のようにすればいいでしょう。

MySQL から取り出したフィールドを $str に入れるものと考えてください。

$str ='姐妹';

echo <<< EOF
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
$str
</body>
</html>

EOF;

※設定された回答回数の上限になりました。さらにフォローが必要でしたら、コメント欄を開けていただくか、回答回数を増やしてください。

◎質問者からの返答

度々ありがとうございます。

ブラウザで表示させるだけなら上記の方法でいいかと思うのですが、これだとCSVでファイルに出力するときに"&#文字コード;"(半角)

で表示されてしまいます。

それを「姐妹」とファイルに出力されるようにする方法はないのでしょうか?


4 ● hard
●30ポイント

mb_decode_numericentity() を使用してみてはいかがでしょうか?

http://jp2.php.net/manual/ja/function.mb-decode-numericentity.ph...

$str = "&#22992;&#22969;";
echo mb_decode_numericentity($str, array(0, 0xffff, 0, 0xffff), "UTF-8");
◎質問者からの返答

ありがとうございました。

解決しました。


5 ● pahoo
●70ポイント ベストアンサー

#3のコメント:

それを「姐妹」とファイルに出力されるようにする方法はないのでしょうか?

方法はあります。


HTML 数値エンティティを文字にデコードする関数 mb_decode_numericentity を利用し、下記のようにすれば、$str に“文字”の形で格納されます。これを CSV ファイルに出力すればよいでしょう。

$code ='&#22992;&#22969;';

$str = mb_decode_numericentity($str, array(0x0, 0x10000, 0, 0xFFFFF), 'utf-8');
◎質問者からの返答

ありがとうございました。

解決しました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ