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で出力しないこと」という事でしたが、
文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。
ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。
お礼
お手数をおかけしています。 詳細に調査したところ1文字の(株)を特殊文字のため 3文字に変換して登録しているのですが、その文字の変換では うまくいき、元からある2バイト文字の(に反応して文字化けを 起こしているようです。 2バイトの(を1バイトの(に変換することで、とりあえず対応しました。 (バイナリエディタで元ファイルを参照しても特に異常はありませんでした) 根本の原因は不明ですが対処できますので、これにて閉じさせていただきます。 ご回答くださいました皆様、ありがとうございました。
補足
ご指摘ありがとうござます。 OSはLINUX(FEDORA) PHPは5.1.6になります。 PHP自体が最新ではありません。 よろしくお願いいたします。