プロが教えるわが家の防犯対策術!

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 …
上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、
文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。

ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

A 回答 (2件)

>EUC-JPで統一したのにこんな問題があったので・・。



EUC-JPで統一したのであれば、EUC-JPで扱えない文字を格納するのはやめましょう。eucJP-winというのもありますがPostgreSQLはeucJP-ms(NEC選定IBM拡張文字が存在しない)です。

http://msyk.at.webry.info/200511/article_2.html
http://ja.wikipedia.org/wiki/EUC-JP

というか今どき「文字コードを統一」するならutf-8以外の選択肢はないと思うのですが・・・


>他の文字コードにする場合ですが、PHPのソースと、データの文字コードを
>変更するのは簡単なのでしょうか?

PostgreSQLはあまり扱ったことがないのですが、基本的にはソースはテキスト処理系のソフトで一括変換、データベースもエクスポートしてからテーブル設定変更(というか削除して再作成)後にインポートという手順になります。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

> というか今どき「文字コードを統一」するならutf-8以外の選択肢はないと思うのですが・・・

そうだったんですね。。知識不足でした。

結局、DB、PHPソース共にUTF-8で作り直し、解決しました。
有難うございました。

お礼日時:2013/01/09 22:16

eucJP-winでも(13区あたりが使えるだけで)「はしごだか」や「たつさき」は含んでいなかったと思います。


(「はしごだか」を扱えない)EUCを使っている以上解決は難しいと思うけど、他の文字セットに変えることはダメなんですか?
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

他の文字セットに変える場合、データとソースを全て修正する必要があるので、できれば避けたいというのが本音です。
また、文字コードについて自分でも調べていますが、この文字コードにすれば間違いなく大丈夫、という確証が得られないでいます。
PHPは初心者で、DBと画面の文字コードを同じにすれば大丈夫という情報があったので、EUC-JPで統一したのにこんな問題があったので・・。
他の文字コードにする場合ですが、PHPのソースと、データの文字コードを変更するのは簡単なのでしょうか?

お礼日時:2013/01/08 17:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!