PHP+Postgres 「髙」が文字化け
DB上に格納した文字列を取得し、PHPで出力すると、
「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。
環境は以下です。
Linux(CentOS 5)
PHP 5.1.6
Apache 2.2.3
PostgreSQL 8.4.3
文字コードは以下です。
Postgres:EUC-JP
PHPソース:EUC
php.ini の[mbstring]はコメントのまま変更していません。
文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。
Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。
mb_language("uni");
mb_internal_encoding("euc-jp");
mb_http_input("auto");
mb_http_output("euc-jp");
$str = "髙橋";
print(mb_convert_encoding($str, "EUCJP-win"));
print(mb_convert_encoding($str, "EUCJP-win","EUC-JP"));
print(mb_convert_encoding($str, "SJIS"));
print(mb_convert_encoding($str, "SJIS","EUC-JP"));
print(mb_convert_encoding($str, "SJIS-win"));
print(mb_convert_encoding($str, "SJIS-win","EUC-JP"));
print(mb_convert_encoding($str, "UTF-8"));
print(mb_convert_encoding($str, "UTF-8","EUC-JP"));
print(mb_convert_encoding($str, "EUC","SJIS"));
print(mb_convert_encoding($str, "Unicode"));
print(mb_convert_encoding($str, "Unicode","EUC-JP"));
print(mb_convert_encoding($str, "UTF-8", "sjis-win"));
print(mb_convert_encoding($str, "CP51932"));
print(mb_convert_encoding($str, "MS932"));
print(mb_convert_encoding($str, "MS932","EUC-JP"));
print(mb_convert_encoding($str, "UTF-8","EUCJP-win"));
print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win"));
print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win"));
print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win"));
print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win"));
print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win"));
print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win"));
http://blog.livedoor.jp/loopus/archives/50160285.html
上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、
文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。
ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。
お礼
どうもありがとうございます。 きちんと動作確認してから返事しようかと思ったのですが、ちょっと時間がかかりそうなので現状だけご報告です。 どうもバイナリで保存はできたようなのですが、表示させるときそのまま表示してしまうようで、 \345\274\265\350\227\235\350\254\200\345\220\214\351・・・ と羅列してしまいます。 バイナリから文字に戻してやらないといけないんだろうなーといろいろ試しているのですが、うまく表示されない状態です。 いくつか疑問点もあるので、解決しながらとは思ってるのですが、チョット他に仕事が入ってしまいまして。。。 また改めて質問させて頂くかもしれません。 どうもありがとうございました。 何かお気づきの点がありましたらまた御願いいたします。