
海外の掲示板のようなソフトを使ってみました。
書き込み⇒確認画面⇒書き込み終了
というよくある流れです。
日本語で書き込んで、確認画面を見ると文字化けしています。
具体的には、日本語でタイトル部分と本文部分に、「文字化け」と記入して確認画面に移動。
ブラウザ上は
1、タイトル
??»?²½?±
2、本文
ʸ&raq uo;ú²& frac12;¤±
ソースを見てみると
1、タイトル
ʸ»ú²½¤±
2、本文
ʸ&raq
uo;ú²&
frac12;¤&plusmn
これは、いったいどういう状況なのでしょうか??
通常言われている、エンコードをそろえる、METAタグで指定、.htaccessでの修正などを行いましたが、どうも関係ないようです。。
ASCIIコード?ISO-8859-1?に強制的に変えられているのでしょうか?
ソースとブラウザで違うというのは・・・よく分かりません。。
この状況についてと、解決策を教えていただけないでしょうか?
よろしくお願いいたします。
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 も日本語も使えないと思います.
ご丁寧にありがとうございます!
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専用ということが分かれば、いい勉強になったと諦めがつきます。
もしよろしければご教授ください。
よろしくお願いいたします。
No.3
- 回答日時:
> この掲示板アプリは諦めます。
諦めるのを止めるつもりはありませんが,ひょっとしたら簡単な改造で
使えるようにできるかもしれません.勉強と思ってやってみては?
> 仰るとおり、Êが見つかりました。
非 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
詳細に教えてくださり、ありがとうございます。
一応やってみましたが、変換せずに出力することができませんでした。
私の技術不足・・・だと思いますが。
(1) まず,元の文字を文字参照に変換している部分をコメントアウトして,
変換せずにそのまま出力するようにする.
それらしいところをコメントアウトしてみましたが、変化がないので、最後は片っ端からコメントアウトしてみました。。
ですが、どうしても変換されてしまいます。
色々とアドバイスをいただいて恐縮ですが、今回は別のソフトないし、他の方法で当初の目的を達成しようと思います。
ありがとうございました。
No.2
- 回答日時:
> ご指示どおり、UTF-8にすべてそろえましたが、
> æ��å&s hy;�å��ã� �
> などに化けてしまいます。
EUC-JP の場合と全く同じです.UTF-8 の文字列が ISO-8859-1 と見なされています.
「文字化け」(UTF-8) = 0xE6 0x96 0x87 0xE5 0xAD 0x97 0xE5 0x8C 0x96 0xE3 0x81 0x91
0xE6 æ
0x96 = U+FFFD (REPLACEMENT CHARACTER:Unicode で不明または表現不可能な文字を表す.)
0x87 〃
0xE5 å
(以下略)
> ソフト自体は、ダウンロードしていじれますが、とくに設定する場所は見当たりません。
ならば,入力文字コードは 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 → Ê のような変換をしている
部分が見つかるでしょう.おそらくは配列か連想配列 (PHP にあるのかどうか知りませんが)
に,"Agrave","Aacute","Acirc",… などと定義されていると思います.
ご丁寧に説明してくださり、また貴重なお時間を使っていただきありがとうございます。
ずっと、悩んでいたのがすっきりしました。
> HTTP リクエストパラメータの文字コード変換なんかもやってくれるんでしょうか?
PHPのマルチバイト文字列関数 (mbstring)なるものを使ってできるようです。
レンタルサーバーの場合、PHP ini がいじれない場合が多いので、.htaccessをいじるようです。
私も.htaccessをいじりましたが、今回はまた別の問題だったようですね。
ご参考までに、
http://manual.xwd.jp/ref.mbstring.html
>ソースを調べてみれば,0xCA → Ê のような変換をしている
部分が見つかるでしょう.
仰るとおり、Êが見つかりました。アプリで決めうちされてしまうと、日本語化できないのですね。。。
勉強になりました。
この掲示板アプリは諦めます。
今回教えていただけなかったら、今後もずっと悩み続けていたと思います。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Ameba(アメーバブログ) アメブロは、HTMLのタグの入力を許さないブログ・サイトですか? 1 2023/06/18 18:48
- ホームページ作成・プログラミング アメーバ・ブログは"HTMLタグ"を許可してないのですか? 2 2023/06/17 21:08
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- メディア・マスコミ 経済制裁に疑問 4 2022/04/06 22:26
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Evernote Evernote(エバーノート)の文字化け 1 2022/04/05 19:30
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- 戦争・テロ・デモ 岸田政権が中立を取らず、あからさまに西側に味方したからでは? 8 2022/04/03 14:02
- 世界情勢 ウクライナは戦勝国でしたっけ? 4 2022/04/11 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
2バイト文字をJEFからSJISに変...
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
英数字を含む文字列(0-9,A-Z)...
-
改行コード変換のタイミングに...
-
「髙(はしごたか)」を文字コー...
-
VB6.0のコードエディタでの改行...
-
mb_conver_encoding()の挙動
-
VBでIMEの変換文字列を拾いたい
-
RubyでUTF8のコード値を文字に...
-
数値のパック10進数の変換に...
-
お世話になります。
-
sedで日本語の置換方法について
-
画像データ(png)をcsvファイル...
-
C#でバイナリデータをテキスト...
-
Symfowareでのデータ型変換につ...
-
ふりがなをアルファベット化す...
-
latin-1 (ISO-8859-1)への変換
-
ヘキサコードとバイナリについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EBCDIC⇒SJIS変換の方法
-
セル内の文字列が日本語か英語...
-
std::stringからLPCWSTR型への変換
-
ふりがなをアルファベット化す...
-
「彡」って文字はなんという文...
-
VS 2008(VB.NET)
-
フォームのコントロールのバッ...
-
ExcelVBA実行後に時々落ちる
-
sedで日本語の置換方法について
-
COBOLによる全角・半角混...
-
Excelマクロにて30分単位の計算...
-
Symfowareでのデータ型変換につ...
-
2バイト文字をJEFからSJISに変...
-
「髙(はしごたか)」を文字コー...
-
S-JIS → JIS コード変換するには
-
%fと%gについて
-
PL/SQLでSJISの文字コードを取...
-
JIS → S-JIS コード変換するには
-
RubyでUTF8のコード値を文字に...
-
英数字を含む文字列(0-9,A-Z)...
おすすめ情報