あなたは累計 |
|
人目の訪問者です。 |
YY-BOARDの設置で苦労した日本語チェックについてです。
入力された文字列の中に日本語が存在しているかをチェックします。
海外からのスパムを防止するためです。
YY-BOARDの日本語チェックでは全角記号を日本語と認識してしまう為、見た目には日本語が無いのに投稿が成功してしまいます。
そこで全角記号は日本語と判断しないよう修正する必要がありました。
他のサイト日本語チェックを見ると、「use utf8;」を呼び出しているのですが、YY-BOARDでは文字化けが発生してしまいます。
<input type="button" value="前画面に戻る">のvalue値がどうしても文字化けしてしまいます。
ちゃんと<meta charset="UTF-8">になっているのですが。
「use utf8;」を呼び出すと文字化けするので、「use utf8;」無しで実行してみたら問題無く動いてしまいました。
元々ソースはUTF-8で記述されているので「use utf8;」無しでも問題無いようです。
注意することはチェックするには内部文字列である必要があると言う事です。
下記の例では、「$in{comment}」がフォームから入力された文字列です。
「$in{comment}」を直接チェックしても上手く行きません。
無事に全角記号は日本語として認識されなくなりました。
use Encode;
sub jp_wd {
# 内部文字列にするため変数に代入する。念の為UTF-8に変換する。
my $comment = Encode::decode('UTF-8', $in{comment});
# \p{Han}が漢字、\p{Hiragana}がひらがな、\p{Katakana}がカタカナのチェックを行う。
# 日本語が含まれていないとエラーになる。
if ($comment !~ /[\p{Han}\p{Hiragana}\p{Katakana}]/) {
error("メッセージに日本語が含まれていません");
}
}
なお、cgiの中で日本語文字列の比較などの処理を行う場合はやはり「use utf8;」が必要となります。
その場合、必要な箇所で「use utf8;」を記述した後、不要になる場所で「no utf8;」と記載してやれば以降は「use utf8;」が無効になってくれます。
一応、「use utf8;」を記載した場合の文字化けも解消することが出来ました。
文字化けしている文字列がどこに記載されているのか調べてみるとcgi本体ではなく、「tmpl」フォルダ配下にあるテンプレートhtmlに日本語が記載されていると文字化けするようです。
ちゃんとUTF8で記述されているのですが何故文字化けするのかは分かりません。
「error.html」を修正してみます。
12行目の「<b>:: エラー画面 ::<b>」で日本語が使用されています。
こちらを「<b>:: !title! ::<b>」の様に変数に置き換えます。
22行目の「<p><input type="button" value="前に戻る" onclick="history.back()" class="color red button"><p>」
こちらも同様に「<p><input type="button" value="!button!" onclick="history.back()" class="color red button"><p>」日本語部分を変数にします。
「init.cgi」の283行目「$tmpl =~ s/!error!/$err/g;」の下に
以上の様に追加してやると文字化けが解消されます。
$tmpl =~ s/!title!/エラー画面/g;
$tmpl =~ s/!button!/前画面に戻る/g;