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

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

解決済みの質問

IEでの文字化け(?)について

いつもお世話になります。
IE(6.0.29)で文字化けらしきことが起こり、行き詰ってしまいました。
申し訳ございませんが、対策方法等、ご教授お願いいたします。

状況は以下の通りです。(複雑です。すみません。)

BDから値を読み出して、表示させようとしています。
いままでは問題なかったのですが、下記のような文字列で試してみたところ、
文字化けしてしまいました。(FireFoxでは問題ありません)
ソースコードを見ると、さらにひどい文字化けが起こっていました。

あと、DBの値を例えば、"[至急です]"の部分を"[至急]"に変更すると、文字化けが収まります。
また、下記のソースにDBの値をコピ&ペーストで貼り付けて表示させると、文字化けは起こりません。

以上、カテゴリ違いかもしれませんが、よろしくお願いいたします。
(情報が足りなければ、教えてください。UPします。)

【コード】
<?php
$sql = "SELECT title FROM hoge WHERE no = 1";
$rst = mysql_db_query(DB_NAME, $sql, $con);
$col = mysql_fetch_array($rst);
$title = $col['title'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css">
</head>
<body>
<h1><?= $title ?></h1>
</body>
</html>
【DBの値】
[至急です]テキストは左寄せ、画像は右下に?
【画面に表示される内容】
[至急です]テキストは左寄せ、画像は右下にOh1>
【ソース】
<h1>[閾ウ諤・縺ァ縺兢繝・く繧ケ繝医・蟾ヲ蟇・○縲∫判蜒上・蜿ウ荳九↓・/h1>

投稿日時 - 2006-11-26 17:21:03

QNo.2563671

すぐに回答ほしいです

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

>意図的にカットしている訳ではありません。
>確認画面から、DB登録の間では、変換等は一切していません。

DBのカラムのサイズが不十分なので、INSERT時に自動的に切れちゃっているんじゃないでしょうか。

DBからSELECTで取り出した値に対して、
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
してみたらどうでしょう。

#本来は、データの長さのチェックをきちんとしてから、DBにデータを登録すべきだと思います。

投稿日時 - 2006-11-26 22:12:25

お礼

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

DBの文字列のサイズが足りなくなっていました。
初歩的なミスです。(お恥ずかしい。。。)

euc-jpのプログラムを変更して、utf-8にしていたため、
文字数のチェックがおかしくなっていたのを、直してませんでした。

長い間、ありがとうございました。

投稿日時 - 2006-11-26 22:21:47

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

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

回答(5)

ANo.4

>[至急です]テキストは左寄せ、画像は右下にしたい<br />
>のように、ゴミは入っていないようです。
>とすると、問題は、PHP→MYSQLへのデータの引渡しにあるのでしょうか?

そうかどうかは判りません。気になるのは、

[至急です]テキストは左寄せ、画像は右下にしたい<br />
という文字列が、
[至急です]テキストは左寄せ、画像は右下に
になっていることです。
これはどうしてでしょうか? わざと途中で文字列を切っているのでしょうか? 途中で切っているとしたら、どのようにして切っていますか?(原因がその辺にあるような気がしています)。

投稿日時 - 2006-11-26 21:23:36

お礼

たびたびありがとうございます。

確認画面までは、
[至急です]テキストは左寄せ、画像は右下にしたい<br />
となっており、DBに登録されると、
[至急です]テキストは左寄せ、画像は右下に?
となっています。
意図的にカットしている訳ではありません。
確認画面から、DB登録の間では、変換等は一切していません。

投稿日時 - 2006-11-26 22:03:00

ANo.3

とりあえず、
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
をかませば、ゴミバイトは取れます。
試してみてください。

投稿日時 - 2006-11-26 20:07:48

お礼

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

教えていただいた関数をかましてみましたが、状況は変わりませんでした。
その他、マニュアルで目に付いた関数を試してましたが、効果無しでした。
mb_http_output('UTF-8');
mb_internal_encoding('UTF-8');
mb_substitute_character();
$str = mb_convert_encoding($str, 'SJIS');
$str = mb_convert_encoding($str, 'UTF-8', 'SJIS');
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');

ちなみに、フォーム入力後、確認用のページを設けているのですが、
そこでのソースは
[至急です]テキストは左寄せ、画像は右下にしたい<br />
のように、ゴミは入っていないようです。
とすると、問題は、PHP→MYSQLへのデータの引渡しにあるのでしょうか?

投稿日時 - 2006-11-26 21:00:39

ANo.2

DBデータ
[至急です]テキストは左寄せ、画像は右下に
の末尾に、ゴミバイトがついているのだと思います。

ブラウザでは、ゴミバイトが次の「<」と一体化して解釈されているように思われます。

HTMLソース表示では、UTF-8がSJISだと解釈されているようです。
至急(UTF8) → e8 87 b3 e6 80 a5
閾ウ諤(SJIS)→ e8 87 b3 e6 80

DBにデータを入れた際に、マルチバイト文字の境界を意識せずに、後ろをちょん切ったりしてませんか?

投稿日時 - 2006-11-26 18:18:54

補足

追加です。(バラバラですみません。)

DBの文字列から"?"を削除すると、文字化けはなくなりました。
あと、フォームへの入力をコピペではなく、手入力すると、"?"がつかない状態で、文字列がDBに保存され、文字化けもなくなりました。

ただ、フォームへの入力はペースト禁止という訳にもいかないので、
コピペした場合にくっついてくる"?"をなんとかしてやる必要があります。

すみませんが、お知恵を貸してください。

投稿日時 - 2006-11-26 19:15:24

お礼

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

テキストは、 http://oshiete1.goo.ne.jp/qa2554892.html
からもって行きました。
おっしゃるように、DBに保存された文字列には、元々なかった"?"がくっついており、これが、"<"と一体になって悪さをしているようです。

で、同じ作業(入力フォームからDBに保存する)を2回やってみたのですが、結果は同じで、"?"がくっついてきます。
ちなみに、フォームに入力された文字列には、次の変換をかけています。
function convertVarchar($str)
{
$str = trim($str);
$str = stripcslashes($str);
$str = htmlspecialchars($str, 3, "UTF-8");
$str = mb_convert_kana($str, 'aKV' , "UTF-8");
return $str;
}

すみません、何か気づいたことがあれば、教えてください。

投稿日時 - 2006-11-26 19:10:09

ANo.1

 DBの中に入ってるデータがEUCとかSJISとかそんなオチは無いよね?

 とりあえずphp.iniを見てみるとどーでしょーか。
・output_handler
・default_charset
・mbstring.language
・mbstring.encoding_translation
・mbstring.http_input
・mbstring.http_output
・mbstring.internal_encoding
・mbstring.substitute_character
 辺り。

投稿日時 - 2006-11-26 17:55:14

補足

htaccessをいじって、下記のように変更してみましたが、状況は変わりませんでした。
mbstring.detect_orderUTF-8auto
mbstring.encoding_translationOffOn
mbstring.func_overload00
mbstring.http_inputUTF-8auto
mbstring.http_outputUTF-8SJIS
mbstring.internal_encodingUTF-8EUC-JP
mbstring.languageJapaneseJapanese
mbstring.substitute_characterno valueno value

あと、phpinfoをみていて、怪しげだったのが、これです。
HTTP_ACCEPT_CHARSET Shift_JIS,utf-8;q=0.7,*;q=0.7

当方apacheの知識がないものですから、どう対策してよいのかわかりません。
すみませんが、なにか対策方法があれば、教えてください。

投稿日時 - 2006-11-26 18:34:57

お礼

ご回答ありがとうございます。
DBはチェックしていたのですが、phpの方は見ていませんでした。
で、結果はこんな感じでした。
output_handler no value no value
default_charset no value no value
mbstring.detect_order auto auto
mbstring.encoding_translation Off On
mbstring.func_overload 0 0
mbstring.http_input auto auto
mbstring.http_output SJIS SJIS
mbstring.internal_encoding EUC-JP EUC-JP
mbstring.language   Japanese Japanese
mbstring.substitute_character no valueno value

mbstring.http_output と、mbstring.internal_encoding をutf-8にしてみます。

投稿日時 - 2006-11-26 18:10:13

あなたにオススメの質問