みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

文字コード(UTF-8)文字化けについて

以下のphpを実行したところ、入力した文字によって文字化けしたりしなかったりします。
どなたか原因が分かる方がいらっしゃったら教えてください。
(見、一は化けない。上、実は化ける。)
phpはバージョン5.2.8を使用しています。
(コード)-----------------------
<html lang="ja">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
<head>
</head>
</body>
<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$org_text1 = "見";
$org_text2 = "上";
$org_text3 = "実";
$org_text4 = "一";
$telop_text1 = mb_convert_encoding($org_text1,'utf-8','ASCII, JIS, EUC-JP,SJIS');
$telop_text2 = mb_convert_encoding($org_text2,'utf-8','ASCII, JIS, EUC-JP,SJIS');
$telop_text3 = mb_convert_encoding($org_text3,'utf-8','ASCII, JIS, EUC-JP,SJIS');
$telop_text4 = mb_convert_encoding($org_text4,'utf-8','ASCII, JIS, EUC-JP,SJIS');
echo "telop_text1=";
echo $telop_text1;
echo "<br>";
echo "telop_text2=";
echo $telop_text2;
echo "<br>";
echo "telop_text3=";
echo $telop_text3;
echo "<br>";
echo "telop_text4=";
echo $telop_text4;
?>
</body>
</html>
(結果)-------------------------
telop_text1=見
telop_text2=
telop_text3=タ
telop_text4=一

投稿日時 - 2009-09-10 00:36:16

QNo.5277163

困ってます

質問者が選んだベストアンサー

http://www-ise3.ist.osaka-u.ac.jp/miura/?PHP%20GET%2FPOST%A5%E1%A5%BD%A5%C3%A5%C9%A4%C7%A4%CE%C6%FC%CB%DC%B8%EC%A4%CE%CA%B8%BB%FA%B2%BD%A4%B1%CB%C9%BB%DF
「PHP GET/POSTメソッドでの日本語の文字化け防止」
こちらの記事をお読みください。
サンプルの文字数が少ないと、UTF-8/EUCのあたりで誤検出します。
その記事の中の「文字化けを防止する方法 」という箇所のように設定する方法が一般的のようです。

投稿日時 - 2009-09-10 23:49:00

お礼

おぉ!まさにこれっぽいです。
まさか文字によって認識されたりされなかったりするとは。

ご紹介いただいたURLを参考にプログラムを修正してみます。
ありがとうございました。

投稿日時 - 2009-09-11 00:05:49

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

autoじゃなくて省略でした。省略でdetect_orderが参照されます。
環境のみでなんとかする場合はdetect_orderを適切な値にしておきます。
1.変換を行わない
2.入力のエンコーディングを制限する
3.使用するエンコーディングを優先検出する
4.誤検出率を下げる => 特定文字の使用や検出用文字数を増やす

フォーム絡みでいえば mbstring.http_input はオフにしておくべきかいな。

投稿日時 - 2009-09-11 00:39:33

ANo.1

$org_text2 = "上";
と書いた時点でその文字列は
内部文字コード(internal_encoding)になるわけですが
変換する意味あるのでしょうか?

あと第3引数はエンコーディング検出順序ですが、
先頭から優先となります。ASCIIを優先させる意図は??
例:eucJP-win,UTF-8,SJIS-win,jis もしくは auto
また、検出は完璧ではないです。

投稿日時 - 2009-09-10 05:25:45

補足

ご回答ありがとうございます。

> 変換する意味あるのでしょうか?
本来のプログラムはフォームより入力された文字を読み込み、
utf-8 に変換しています。
フォームでの入力でも $org_text2 = "上"; としても
どちらも同じように見、一は化けない。上、実は化ける、といった
入力した文字によって文字化けしたりしなかったりといった弊害があります。
どちらも共通した原因と考え、質問しました。

>ASCIIを優先させる意図は??
autoでうまくいかなかったため、上記のようにしました。
autoはASCII,JIS,Shift_JIS,EUC-JP,SJIS" に展開されるので、
上記のようになっています(EUC-JPは記載忘れです、済みません)。

以上私に誤解がありましたらご指摘お願いします。

投稿日時 - 2009-09-10 22:01:43

あなたにオススメの質問