- ベストアンサー
掲示板CGIでの半角カナ使用について
自作掲示板を設置しています。 が、私のサイトのお客さんは書き込みに2ch風の書き込みをする方が多く来られます。 それで半角カナを掲示板で使用したいのですが、どうしても文字化けしてしまいます。 因みに <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=x-sjis"> とか <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=Shift_JIS"> というタグを挿入してみたのですが、これは関係あるのでしょうか?どちらを使ってもダメでしたが…。 またはサーバの問題なのでしょうか。 数日調べてみたのですがどうも答えがわからなかったのでこちらで質問させていただきます。 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> もしかしたらこの部分は関係があるでしょうか。 まさにその部分です^^ コード変換を行っているのは &jcode'convert(*value,'sjis'); なので、これを # &jcode'convert(*value,'sjis'); とコメントアウトすれば実行されなくなります。 もし、どうしてもチェックをしたい場合、ダミー文字列を使うという手法があります。 ちょっと長めですが、以下にその方法を載せます。 まず投稿フォームの中に、以下のようなダミーの日本語文字列を埋め込んでおきます。 <INPUT type="hidden" name="jcode" value="日本語"> ※ダミー文字列は、あまり短いと効果がありません。 No.4 の補足にあるデコードルーチンから &jcode'convert(*value,'sjis'); の行を削除、またはコメントアウトします。 デコードルーチンの最後、つまり $FORM{$name} = $value; } の下に、次のようなスクリプトを追加します。 # ダミー文字列の内容が変わっていたら・・・ if ($FORM{jcode} ne '日本語') { # その文字コードを調べて my $icode = jcode::getcode(\$FORM{jcode}); # 全パラメータに対し、$icode -> Shift_JIS の変換をする foreach (keys %FORM) { jcode::convert(\$FORM{$_}, 'sjis', $icode); } } ※全角空白を入れてるので、コピペの際は注意! ※掲示板CGIファイル自体も、Shift_JIS でないといけません。 もし、ブラウザが送信時に文字コードを変換するとしても、パラメータごとに別の方法で変換することはありえないので、確実に全角であるパラメータの文字コードを調べればよいわけです。
その他の回答 (5)
- leaz024
- ベストアンサー率75% (398/526)
半角だけが化けるというのは、ほぼ間違いなくCGIのデコード処理に問題があります。 デコードの際の漢字コード変換には jcode.pl がよく使われますが、多くのフリーCGIや書籍のサンプルはその使い方が甘いため、半角カナのみの場合は確実に化けるだけでなく、全角文字でもまれに文字化けすることがあります。 (jcode.pl は Shift_JIS 半角カナ文字を euc-jp と誤認します。) どんな場合でも確実にコードを特定する、というのは非常に困難ですが、プログラムを工夫すればある程度は精度を上げることができます。 また、現在利用されているほとんどのブラウザは、HTMLと同じ文字コードで送信してきますので、HTMLが Shift_JIS であるならば、ほとんどのユーザからの送信に対して文字コードの変換は不要ということです。 以前、比較的ユーザの多い掲示板サイトで仕事をしていたときに、実験的にコード変換ルーチンをスキップさせてみたことがありますが、投稿内容が文字化けするという不具合連絡はほとんどありませんでした。 (一般的に利用されているブラウザでの連絡はありませんでした。) 一度コード変換ルーチンを外して、様子を見てみてはどうでしょうか。
補足
ありがとうございます。 詳しい解説までいただき、感謝いたします。 実は以前CGIの掲示板を使用していた際に、ある方の書き込みが(全角の普通の日本語)突然化けてしまって、とても申し訳ない思いをしたことがありました。そういうこともあるのですね。 現在設置しようとしている掲示板はMETAタグを挿入し、Shift_JISで読み込むように設定しております。 それで、お手数なのですが 「コード変換ルーチンをスキップさせてみる」 という部分、具体的にスクリプトのどういった部分の記述を直せばよろしいか教えていただけるでしょうか。 CGIの、レイアウトに関する部分は読むことができ変更も普段やっておりますが、プログラミングが関わる部分については殆んど知識がない状態です。 見当違いでしたら申し訳ありませんが、もしかしたらこの部分は関係があるでしょうか。 #------------------- フォームデコード if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'}); } else { $formdata = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$formdata); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\n//g; $value =~ s/\,/,/g; &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } もし良い方法があるようでしたら是非教えていただければと思います。 宜しくお願い致します。
- feininger
- ベストアンサー率41% (74/180)
> データファイルの半角で書いた部分の文字は化けています。 > データファイルに直接書き込んでアップロードするとその部分はちゃんと半角カナで表示されました。 そうなりますと今度は、 CGIがエンコード/デコードする際に化けているのか? (掲示板ということなので)POSTでCGIが受け取った時点で既に化けているのか? ということになるかと思います。 前者であればCGIを修正することで解決できますが、 後者だとサーバーのOSや設定で左右されてしまう問題なので解決は難しいかと。 (言わんとするところはMin_2さんと同じです) POSTではなくGETにすることで状況が変わる可能性もありますが、 また別の問題を抱えることになるでしょうし・・・うーん、難しい。
補足
ありがとうございます。 早速スクリプト内のGETとPOSTを選択する部分を書き替えてみました。 、がやはり半角文字だけが化けてしまうようなのです。 ところでGETやPOSTが何を意味するのかすら知らないのですが、本当に勉強不足ですね…。 CGIを触るからにはもう少し語彙や記述方法の基本を学ぼうと思いました…。
文字化けの問題はクライアントのマシン(Win、Mac、Unix系)やブラウザとそのバージョン(IE、Netscape、Opera)などでも違いがあります。ですのでその確認はなかなか難しいところです。
補足
ありがとうございます。 以前同じスクリプトを使用していたときは確か半角が化けていなかったと思うのですが、そういえば最近IE.6にバージョンアップしまして、その後にまたこのCGIを使いはじめました。 もしかしたらブラウザとも関係があるのでしょうか。。。
通常ネットワーク上では半角カナは使用禁止にします。どうしても文字化けを避けることができない根本的な原因があるからです。jcode.pl等で全角へ強制変換することもできますが、Shift-JISではなかなか思い通りに行かないようです。
補足
ありがとうございます。 時々、例えば2chのように半角カナ書き込みが使える掲示板を見かけるので、もし私の環境でもできるようであればやってみたいなと思っております。 No.1の方のレスに補足をしましたとおりの状況です。 これで何か思い当たることがおありでしたら、また教えていただければと願っております。 宜しくお願い致します。
- feininger
- ベストアンサー率41% (74/180)
半角カナだけが化けているのですか?←このケースだとMETAタグによる効果はないです。 全角文字も化けているのですか? どこで化けているか?が重要かと思います。 掲示板のデータファイルは化けていますか? 掲示板のデータファイルに半角カナを直接書き込んでも化けて表示されますか? サーバー側に原因がある場合、解決は難しいかもしれませんが、 cgiファイル自体を文字コード変換(EUCやS-JISに)してから設置すると解決するケースもあります。
補足
ありがとうございます。 半角だけが化ける状態です。 データファイルの半角で書いた部分の文字は化けています。 データファイルに直接書き込んでアップロードするとその部分はちゃんと半角カナで表示されました。 上記の状態で何か判明することがあればまた教えていただけるでしょうか? 宜しくお願い致します。
お礼
leaz024さん、丁寧に教えていただきありがとうございました!! 説明のとおりにしてみました。ダミーの日本語文字列も試してみました。 おかげさまでとうとう半角カナが使えるようになりました!全てきれいに表示されております!! 大変お世話になりました。 掲示板等CGIを使う際、使い勝手が100%のものがなかなか見つからないので(かなりワガママですが)色々トライしてみたいのですが、スクリプトを触るからにはもう少し勉強してみようと思います。 本当にありがとうございました。