« 2012 . 05 »    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

機種依存文字などチェック 

VISTAのサロゲート文字やらが出てきたので
入力フォームで、禁止文字列を判別できないかという依頼で作成したものです。

最初に依頼を受けたときに、下調べもせずに
Javascriptで文字コードチェック?まぁできるやろ~と思ったのが大間違い・・
やり始めたらめっちゃ大変でした・・
これなら本体のPHP側で制御した方が簡単やん・・

システムの概要
ホワイトリスト方式で、半角~第1水準漢字~第2水準漢字の一部までを許可し
それ以外は全て禁止文字としています。
(もちろん丸1とか機種依存文字も除く)

最初にEUC文字で判別するようにしようと思って
UINCODEからEUCコードに変換するものを作ったりしていたんだけど
なんかの理由でうまくいかず取りやめ
UNICODEのままチェックをすることにしました。

UNICODEだと、文字列がShiftJISやEUCと同じ並びになっていないため
チェック用のコード表を別途用意。
最初、配列で用意していたら検索にものすごく時間がかかったので
「:」コロン区切りで数値データだけをリスト化しました。

コードファイルはこちら
→unicode.js


チェック用Javascript


function checkKeyword(formElement){
var str = formElement.value;
var str_length = str.length;
var code, scode;

for (var i = 0; i < str_length; i++) {
code = str.charCodeAt(i);
code = code.toString(16);

//4桁以下なら先頭に0を追加
if(code.length < 4){
var figure = 4 - code.length;
var rcode = "";
for(var fi = 0; fi < figure; fi++){
rcode += "0";
if(rcode.length > figure){
rcode = rcode.slice(0,figure);
break;
}
}
code = rcode + code;
}

//ザックリと範囲チェック&改行コードとタブコードチェック
if(!(0x20 <= "0x"+code && 0x7e >= "0x"+code) &&
code != "000a" && code != "000d" && code != "0009"){
if(code.charAt(0) == "0" || ( code.charAt(0) >= "2" &&
code.charAt(0) <= "9" ) || code.charAt(0) == "f"){
scode = code.substring(1,4);
if(eval("u"+code.charAt(0)+"a").indexOf(":"+scode) == -1){
return false;
}
}else{
return false;
}
}
}
return true;
}

Comment

Post a comment















管理者にだけ表示を許可する

Trackbacks

この記事のトラックバックURL
→http://flamberge12.blog43.fc2.com/tb.php/5-a1685332 

機種依存文字検出のアルゴリズム変更

前回のバグ回避策で触れましたように機種依存文字の検出ロジックを見直し、 ver.0.3bで公開します。 NGをチェックする方式 &rArr; OKをチェックする方式 に変更しました。 機種依存...