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

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

ASCIIコードの文字化け??

海外の掲示板のようなソフトを使ってみました。 書き込み⇒確認画面⇒書き込み終了 というよくある流れです。 日本語で書き込んで、確認画面を見ると文字化けしています。 具体的には、日本語でタイトル部分と本文部分に、「文字化け」と記入して確認画面に移動。 ブラウザ上は 1、タイトル ʸ»ú²½¤± 2、本文 ʸ&raq uo;ú²& frac12;¤&plusmn ソースを見てみると 1、タイトル ʸ»ú²½¤± 2、本文 ʸ&raq uo;ú²& frac12;¤&plusmn これは、いったいどういう状況なのでしょうか?? 通常言われている、エンコードをそろえる、METAタグで指定、.htaccessでの修正などを行いましたが、どうも関係ないようです。。 ASCIIコード?ISO-8859-1?に強制的に変えられているのでしょうか? ソースとブラウザで違うというのは・・・よく分かりません。。 この状況についてと、解決策を教えていただけないでしょうか? よろしくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • 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;が見つかりました。アプリで決めうちされてしまうと、日本語化できないのですね。。。 勉強になりました。 この掲示板アプリは諦めます。 今回教えていただけなかったら、今後もずっと悩み続けていたと思います。 本当にありがとうございました。

関連するQ&A

  • ネット上のファイルが開けない。ダウンロードできない

    どなたか下記について教えてください。 よろしくお願いします。 (1)中国の某大学のHPにアクセスし、ファイルを開こうとすると『Webページに問題があるため正しく表示または機能しなくなる可能性があります』と表示され、内容を見ることが出来ません。 (2)HP上のwordファイルをダウンロードしようとすると、下のメッセージが表示されダウンロードできません。↓ Not Found The requested URL /data/40273/download/&Ouml;&ETH;&sup1;&uacute;&Eacute;&ccedil;&raquo;&aacute;&micro;&Auml;&frac34;&Agrave;&middot;×&frac12;&acirc;&frac34;&ouml;&raquo;&uacute;&Ouml;&AElig;&Oacute;E&ccedil;&Ecirc;&Eacute;&Iuml;&agrave;&sup1;&Oslash;&Ouml;°&Ograve;&micro;&micro;&Auml;&Ccedil;°&frac34; was not found on this server. ------------------------------- Apache/1.3.26 Server at learn.tsinghua.edu.cn Port 80 上記の(1)、(2)共に中国内のインターネットカフェのPCを使用した場合には問題なく開くことが出来ます。 どうして?? 誰か助けてください。

  • 突然の文字化け

    POWER BOOK G4 1.5Ghz OSは10.4.3です。 FirefoxとThunderbirdを使用。 数日前から突然の文字化けに悩んでます。 ブラウザ全体が文字化けするわけではなく、たとえば この質問内容を書き入れるようなメッセージボックス(というのでしょうか?)に文字入力しようとすると 文字化けした文字しか入力できないのです。 半角のカタカナまたはスペースの羅列になります。(スペース部分が多い) また、Thunderbirdでは、本文が全く読めません。 文字エンコーディングをいじっても、まるで読めないのです。 ちなみにタイトルは文字化けしていません。 また、safariを使うとこういう症状は出ません。 この症状を治すにはどうすればいいのでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Mac
  • AppleMail 文字化けについて

    MacOSX 10.4.11を使っています。 AppleMailで送信していて、文字化けをするという事をよく言われたので文字化けをしない様にエンコーディングをISO-2022-jpに変更しました。 変更は様々なサイトで提供されているやり方 1.デフォルトのエンコーディングを“UTF-8”エンコーディングから“ISO-2022-JP”エンコーディングに設定   方法:      1.「ターミナル」(/アプリケーション/ユーティリティ/)を開きます。      2. プロンプトの後に次のコマンドを入力します。       defaults write com.apple.mail NSPreferredMailCharset "ISO-2022-JP"      3. コマンドの入力後、「Return」キーを押します。      4.「ターミナル」を終了します。 を参考にしました。 ですが、どうしてか文字化けが治りません。 Thunderbird3で確認してみたところ、タイトルは普通に見えるのですが、本文が文字化けをしています。 エンコーディングはSHIFT-JISになっているのですが、再度Shift-JISを選択すると、今度は本文が見える様になってタイトルが文字化けをします。 思うにタイトルと本文のエンコーディングが違うのかと思いいろいろエンコーディングを変えたら、タイトルはISO-2022-jpで本文がShiftJISで送られている様に思います。 何か解決方法があれば教えて頂きたいと思います。 よろしくお願いします。

    • ベストアンサー
    • Mac
  • ファイルを添付すると文字化けします

    OUTLOOKを使っているのですが ”ファイルを添付した時のみ” 宛先、件名、添付ファイルのタイトルが文字化けしてしまいます。本文はだいじょうぶです。送信済みアイテムから送ったメールを確認しようと開くと文字化けしてます。ただ、宛先一覧でみた時は件名は文字化けしていません。 また、ファイルを添付しないで送信した時は、全く文字化けしません。文字化けしないようにするにはどうすれば、いいのでしょう。よろしくお願いします。

  • gooメールの文字化け

    gooメールで受信したメールが文字化けして読めないものがありました。(メルマガなんですが) 解決方法を、ヘルプにて確認したら、こんなことが書いてありました。 ↓ 送信、もしくは受信したメール本文の中に半角カナ文字や半角特殊文字(句読点等)が入っている際に、文字化けが起こる場合がございます。 メール本文に含まれていないことをご確認の上、送信を行っていただきますようお願い致します。 また、ブラウザの文字コードを「日本語自動判別」にしていただくことで、解決する場合もございますのでお試しいただくようお願い致します。 ブラウザの文字コードを「日本語自動判断」にするには、どうやって設定すればよいのでしょうか? どなたか、詳しい方教えてくださいませ。

  • 原因不明の文字化けで困ってます。

    今、Adobe Go!Liveを使ってホームページを作っているのですが ブラウザ上で、自分の打ったTextが文字化けしてしまいます。 プレビュー画面では(ブラウザを使ったプレビューでも)問題ないのですが... あと、友達のHotmail宛にTextメールを送っても同じく文字化けしてるらしいです。 HTML形式では問題ないです。 いろいろ設定を確認したのですが、一向に原因が分かりません。 助けて下さい。お願いします。m(T-T)m

    • 締切済み
    • Mac
  • 日数カウントダウンが、ブラウザによって文字化けする。

    日数カウントダウンが、ブラウザによって文字化けする。 以下のように、日数のカウントダウンを表示しているのですが、 IEでは正常に表示されるのですが、 safari、firefoxでは、文字化け(数桁の数字が表示)します。 (その他のブラウザは未確認です。) ↓(日数カウントダウンのソース)================================= <script language="JavaScript"> <!-- today=new Date() next_date=new Date(2011, 1, 1); //2011/1/1までの日数を表示。 last=Math.floor((next_date.getTime()-today.getTime())/(24*60*60*1000))+1; document.write("あと",Math.floor(last),"日"); // --> </script> ↑(日数カウントダウンのソース)================================= ブラウザの設定も確認したのですが、原因がわかりませんでした。 ご存知の方、ご教授願います。よろしくお願いします。

  • フォーム受け渡しの際の文字化け

    phpスクリプトで フォーム入力→確認画面→ログファイルに書き込み→別スクリプトによりログファイル読み込み→表示 というスクリプトを作ったのですが、フォームに本文を入力した際に 確認画面で本文を見ると、文字化けしてしまいます。 例えば、芸能界と書けば芸柏lになってしまうなど、何故かある一定の文字が書き込めません。(他の大半の文字は文字化けしない) おそらく、euc-jpではなくSJISでphpスクリプトを作っているためだと思うのですが、どうしてもSJISで書きたい場合、何か解決方法はありますか? また、表示するときにSJISになっていればいいため、入力段階などではeuc-jpでも大丈夫です。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • IE6でのツールバーの文字化けについて

    WindowsXPにてIE6を使用しておりますが、突然ツールバーに表示されるそのページのタイトルやブラウザの上部(青い部分)に表示されるページのタイトルが文字化けしてしまいました。 他のファイル(Offie系など)を開いた時には正しくファイル名がツールバーにも画面上部のブルーの部分にも表示されます。 正しい表示に戻す方法を教えていただきたいと思います。 よろしくお願いします。

  • CGIフォームから飛ばすメールがMacのMailで本文だけ文字化け

    フリーCGIのメールフォームをちょこっとカスタマイズして使用しています。 基本的にJISで作られていて、当然ウィンドウズでは正常にメールを表示することができるのですが、我が家のMacのほうで使っているMailというソフトで確認するとメールタイトルは問題ないのですが、本文が文字化けを起こしてしまっています。 フリーCGIといっても色んなものがあるのでアドバイスをいただきにくいと思うのですが、どのポイントにどのような記述が必要であるなどを教えていただけたら幸いです。 補足★全体をEUCに直す方法もやってみましたが、種類の違う文字化けになりました。検索でいろいろ調べてみると、JISでもきちんとカスタマイズすれば文字化けをしないという書き込みがありましたので、JISの方向で進めたいと思っています。 ちょっとしたことでもいいのでよろしくお願いします!

    • ベストアンサー
    • CGI

専門家に質問してみよう