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


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

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

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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2008/11/13 23:01:21
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:pahoo No.5

回答回数5960ベストアンサー獲得回数633

ポイント70pt

#3のコメント:

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

方法はあります。


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

$code ='姐妹';

$str = mb_decode_numericentity($str, array(0x0, 0x10000, 0, 0xFFFFF), 'utf-8');
id:usjma

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

解決しました。

2008/11/13 23:00:12

その他の回答4件)

id:uradiet No.1

回答回数6ベストアンサー獲得回数1

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

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

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

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

id:usjma

ありがとうございます。

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

2008/11/12 13:26:18
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

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

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

ありがとうございます。

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

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

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

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

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

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

2008/11/12 13:38:04
id:pahoo No.3

回答回数5960ベストアンサー獲得回数633

#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;

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

id:usjma

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

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

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

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

2008/11/13 00:00:16
id:hard No.4

回答回数32ベストアンサー獲得回数4

ポイント30pt

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");
id:usjma

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

解決しました。

2008/11/13 23:00:18
id:pahoo No.5

回答回数5960ベストアンサー獲得回数633ここでベストアンサー

ポイント70pt

#3のコメント:

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

方法はあります。


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

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

$str = mb_decode_numericentity($str, array(0x0, 0x10000, 0, 0xFFFFF), 'utf-8');
id:usjma

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

解決しました。

2008/11/13 23:00:12

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません