• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ASCIIコードの文字化け??)

なぜ日本語が文字化けするのか?

このQ&Aのポイント
  • 海外の掲示板のようなソフトを使用して書き込みをした際に、日本語が文字化けしてしまう状況について説明します。
  • 文字化けの原因として、エンコードの不一致やMETAタグまたは.htaccessファイルの設定との関係についても考察します。
  • 最後に、文字化けの解決策について紹介します。エンコードの統一やサーバー側の設定の確認を行うことが重要です。

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

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

どうやら ・文字コードは EUC-JP で入力されている ・掲示板ソフトはそれを ISO-8859-1 と見なして HTML に変換している ようです. 「文字化け」は EUC-JP では 0xCA 0xB8 0xBB 0xFA 0xB2 0xBD 0xA4 0xB1. これを ISO-8859-1 と見なして文字 (実体参照) に変換すると, 0xCA Ê 0xB8 ¸ 0xBB » 0xFA ú 0xB2 ² (U+00B2:SUPERSCRIPT TWO) 0xBD 1/2 (½) 0xA4 ¤ 0xB1 ± (±) タイトルについては,ソースの段階で既に文字実体参照になっているので, ブラウザの問題ではなく掲示板ソフトが勝手に ISO-8859-1 と見なして 実体参照に変換しているということになると思われます. (ちなみにブラウザで表示したタイトルは,なぜか先頭の2バイトが抜けている.) 本文については,どういうわけか ISO-8859-1 → 文字実体参照の変換が 二重に行われています.なぜそうなるのかは不明. 結論としては,掲示板ソフト側に文字コードを設定する箇所があるのなら, それを EUC-JP にすればいいのですが,まさか海外の掲示板が EUC-JP に 対応しているとは思えないので,Unicode が使用可能ならばそれに設定し, 入力する文字コードも UTF-8 あたりにすれば使えるかも.(あまり自信なし) もし文字コードが選択できないのなら,おそらくその掲示板ソフトは ISO-8859-1 専用なので,Unicode も日本語も使えないと思います.

makoto_ty
質問者

お礼

ご丁寧にありがとうございます! ISO-8859-1に変えられていたのですね。 すっきりしました。 PHPに関しては、文字コードをEUC-JPに設定するように色々なところで言われているようですので、すべてEUCーJPにそろえていました。 ご指示どおり、UTF-8にすべてそろえましたが、 æ��å&s hy;�å��ã� � などに化けてしまいます。 どうやら、ダメなようです。 ソフト自体は、ダウンロードしていじれますが、とくに設定する場所は見当たりません。 しいて言えば、.htaccessくらいで、ここでエンコードに関連する場所をすべてUTF-8にそろえました。(他にメタタグやファイルの保存形式なども) 初心者で分かっていないのですが、そもそもISO-8859-1専用のものなどあるのでしょうか? PHPがマルチバイト対応(japanese enable)なら、form形式でpostするだけなので、日本語がダメというのはどこで設定されているのでしょうか?? 書き込みの「タイトル部分」と「本文部分」以外は、日本語表示ができるので(ここにタイトルを記入してください、などの説明)大丈夫だと思っていました。 文字化け対策で、数週間ずっと頭を悩ませていましたので、ISO-8859-1専用ということが分かれば、いい勉強になったと諦めがつきます。 もしよろしければご教授ください。 よろしくお願いいたします。

その他の回答 (2)

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

> この掲示板アプリは諦めます。 諦めるのを止めるつもりはありませんが,ひょっとしたら簡単な改造で 使えるようにできるかもしれません.勉強と思ってやってみては? > 仰るとおり、&Ecirc;が見つかりました。 非 ASCII 文字を変換せずに出力するよう改造すれば,EUC-JP が使えるように なる可能性があります.その場合でも,ASCII ('<','>','&','"' など) の 変換は残す必要があります.また,その場合,HTTP レスポンスヘッダの Content-Type を EUC-JP に変更する必要があります.   Content-Type: text/html; charset=EUC-JP やり方としては, (1) まず,元の文字を文字参照に変換している部分をコメントアウトして,   変換せずにそのまま出力するようにする.(この段階では ASCII 文字も   変換しないようにしておく.)   また,上記の Content-Type の変更も行う. (2) 掲示板を動かして,タイトルと本文に日本語を入力してみる.   ただし半角の '<','>','&','"' は使用しないこと.   これでうまく表示されなければ見込み薄.   うまくいけば (3) に進む. (3) 文字列を出力する部分を次のように改造.   ・現状は文字列を1バイトずつ読み出して変換しているはずだが,    これを1文字ずつ読み出すように改造する.(EUC-JP の知識が必要.)   ・読み出した文字が '<','>','&','"' ならば文字参照に変換して出力.    そうでなければそのまま出力. EUC-JP (Wikipedia) http://ja.wikipedia.org/wiki/EUC-JP

makoto_ty
質問者

お礼

詳細に教えてくださり、ありがとうございます。 一応やってみましたが、変換せずに出力することができませんでした。 私の技術不足・・・だと思いますが。 (1) まず,元の文字を文字参照に変換している部分をコメントアウトして,   変換せずにそのまま出力するようにする. それらしいところをコメントアウトしてみましたが、変化がないので、最後は片っ端からコメントアウトしてみました。。 ですが、どうしても変換されてしまいます。 色々とアドバイスをいただいて恐縮ですが、今回は別のソフトないし、他の方法で当初の目的を達成しようと思います。 ありがとうございました。

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

> ご指示どおり、UTF-8にすべてそろえましたが、 > &aelig;��&aring;&s hy;�&aring;��&atilde;� � > などに化けてしまいます。 EUC-JP の場合と全く同じです.UTF-8 の文字列が ISO-8859-1 と見なされています. 「文字化け」(UTF-8) = 0xE6 0x96 0x87 0xE5 0xAD 0x97 0xE5 0x8C 0x96 0xE3 0x81 0x91 0xE6 &aelig; 0x96 ￿ = U+FFFD (REPLACEMENT CHARACTER:Unicode で不明または表現不可能な文字を表す.) 0x87 〃 0xE5 &aring; (以下略) > ソフト自体は、ダウンロードしていじれますが、とくに設定する場所は見当たりません。 ならば,入力文字コードは ISO-8859-1 に決め打ちで作られていると思います. > しいて言えば、.htaccessくらいで、ここでエンコードに関連する場所をすべてUTF-8にそろえました。 Apache は数年前に使ったきりで,当時はエンコードの指定などなかったと 記憶しているのでよくわかりませんが,Apache が面倒見てくれるエンコード というのは URL ぐらいじゃないんですかね? HTTP リクエストパラメータの文字コード変換なんかもやってくれるんでしょうか? > そもそもISO-8859-1専用のものなどあるのでしょうか? > PHPがマルチバイト対応(japanese enable)なら、form形式でpostするだけなので、 > 日本語がダメというのはどこで設定されているのでしょうか?? 私は PHP は全く使ったことがないので,PHP のマルチバイト対応がどういうものなのか わかりませんが,それがマルチバイト文字を Unicode に変換してくれるという意味であって, かつ PHP アプリ (掲示板ソフト) が Unicode 対応になっていれば,PHP のサポートする マルチバイト文字コードは使えるでしょう. しかし,マルチバイト対応というのが,単にバイト列を誤った場所で区切らない (例えば シフト JIS の2バイト目が 0x5C になっているのを '\' と誤認しない) という意味ならば, GET または POST された HTTP リクエストパラメータが正しくデコードされて, (元のマルチバイト文字コードのまま) PHP アプリに渡されるというだけのことだと思います. この場合,PHP アプリもその文字コードに対応していなければ意味がありません. 掲示板ソフトはタイトルや本文を普通の文字列として受け取り,HTML に変換して出力します. その場合,HTML にとって特別な意味を持つ ASCII 文字 ('<','>','&','"' など) や, そのままでは正しく表示できないおそれのある文字 (非 ASCII 文字など) は文字参照に変換 する必要があります. その掲示板ソフトでは,後者において,元の文字コードを ISO-8859-1 と決めつけて文字参照 に変換しているはずです.ソースを調べてみれば,0xCA → &Ecirc; のような変換をしている 部分が見つかるでしょう.おそらくは配列か連想配列 (PHP にあるのかどうか知りませんが) に,"Agrave","Aacute","Acirc",… などと定義されていると思います.

makoto_ty
質問者

お礼

ご丁寧に説明してくださり、また貴重なお時間を使っていただきありがとうございます。 ずっと、悩んでいたのがすっきりしました。 > HTTP リクエストパラメータの文字コード変換なんかもやってくれるんでしょうか? PHPのマルチバイト文字列関数 (mbstring)なるものを使ってできるようです。 レンタルサーバーの場合、PHP ini がいじれない場合が多いので、.htaccessをいじるようです。 私も.htaccessをいじりましたが、今回はまた別の問題だったようですね。 ご参考までに、 http://manual.xwd.jp/ref.mbstring.html >ソースを調べてみれば,0xCA → &Ecirc; のような変換をしている 部分が見つかるでしょう. 仰るとおり、&Ecirc;が見つかりました。アプリで決めうちされてしまうと、日本語化できないのですね。。。 勉強になりました。 この掲示板アプリは諦めます。 今回教えていただけなかったら、今後もずっと悩み続けていたと思います。 本当にありがとうございました。