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

DBに入っている文字列(EUC-JP)をUTF-8にエンコードするとき、「?」や「?」などの特殊な文字が化けてしまいます。
化けない方法を教えてください。
言語: PHP4.3.10
DB: Postgresql8.3.1

実際に使っているソースは以下の通りです。

$src = "EUC-JP文字列";
$src = mb_convert_encoding($src,"sjis-win","EUC-JP");
$src = mb_convert_encoding($src,"UTF-8","sjis-win");

●質問者: radre
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:dB EUC-JP SJIS SRC UTF-8
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● pahoo
●19ポイント

まず、EUC-JPで扱える文字は、原則として、JISコード表(JIS X 0208)に掲載されているものに限られます。

「™」や「é」は JIS コード表にない文字ですから、PHPに限らず、大多数の開発環境で変換できないでしょう。(DBのカラムもchar型で定義していたら代入できない場合があります)


このため、radreさんがご利用の PostgreSQL に「™」がどのような文字コード(EUC-JPコード)で格納されているのか分かりませんが、それをUTF-8に変換したいのであれば、str_replace関数を使って行います。

str_replace(「™」のEUC-JPコード, "\x21\x22", $src);

他の変換できない文字についても、逐一、str_replace関数で変換してやる必要があります。

◎質問者からの返答

素早い返事ありがとうございます!

なるほどー。そういうことなんですね。

「?」のEUC-JPコードって、公式には定義されていないんですよね。調べる方法はあるのでしょうか。


2 ● pahoo
●19ポイント

#1のコメントに対する回答

調べる方法はあるのでしょうか。

PostgreSQL から取り出した直後の文字列 $src に対し、下記のように ord 関数を使って文字コードを調べるのがよいでしょう。

$len = strlen($src);
for ($i = 0; $i < $len; $i++) {
$ch = substr($src, $i, 1);
printf("%02X<br />\n", ord($ch));
}

このプログラムでは1バイトずつの表示になってしまいますが、問題の「™」がEUC-JPの1バイト目の条件(0xA1 - 0xFE)を守っているかどうか分からないので、まずは目視で確認してみてください。


回答回数の上限になりましたので、これにて失礼します。

◎質問者からの返答

素晴らし過ぎます(T T)

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

試したところ、「?」は

8F

A2

EF

となっていました。「8F」は0xA1 - 0xFEではないですよね・・・orz

こういう場合、どうすればいいでしょうか?

解答回数を増やしましたので、ご返事いただければ幸いですm(_ _)m


3 ● y-kawaz
●18ポイント

元エンコード指定を EUC-JP ではなく eucjp-ms を指定して mb_convert_encoding すればいいんじゃないでしょうか?

◎質問者からの返答

それをすると、「?」や「?」などの記号は表示されるのですが、今度は「?」などの漢字が化けてしまうのです。

これらを両立する方法を探しているのです。


4 ● practicalscheme
●18ポイント

そのものずばりの回答ではないので、コメント欄を開けて置いていただければ良かったのですが。

0x8f 0xa2 0xef は正当なEUC-JPコードです。0x8fから始まる2オクテットにJIS X 0212 (補助漢字) が割り当てられていて、この場合は補助漢字の0x226F (小さいTM)が相当します。eucjp-msもだいたい同じです。

しかし、eucjp-msで「?」(EUC: 0xfede, Unicode: U+9d70)が化けてしまうというのはわかりません。JIS X 0208の文字なので特に問題が起こりそうにないのですが… もしかすると別の文字か異体字を意図されているのでしょうか。

◎質問者からの返答

ありがとうございます。

勉強になります。


5 ● pahoo
●18ポイント

#2のコメントに対する回答

原始的ですが、下記のように1文字ずつ変換していくのが確実ではないかと思います。

str_replace("\x8F\xA2\xEF", "\x21\x22", $src);

mb_convert_encoding 関数は完全ではありません。

公式リファレンス「サポートされる文字エンコーディング」によると eucJP-ms をサポートしていません。


あとは、外部プログラムを使って変換する方法が考えられますが、eucJP-ms を漏れなく UTF-8 に変換できるツールというものが存在するのかどうか分かりません。

どなたかフォローをお願いします。

◎質問者からの返答

ありがとうございます。

eucJP-msはサポートしてないんですねー。

むむむ。

EUC-JPからUTF-8に変換している方は通常どうされているのでしょうね。特殊文字とか使う機会がないから無視されているのかな?


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



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