サロゲートペアが含まれてるかをJavaScriptでチェックする方法を調べたときのメモ。
ユーザが入力した値にサロゲートペアが含まれていたらエラーとする要件がありましたが、どこでチェックするかに少し悩みました。画面が大量にありサーバ側でチェックするのはパフォーマンス的に不安でしたので、ブラウザ側でチェックすることにしました。
サンプルコード
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 32 |
/** * TESTクラスの項目でサロゲートペアをチェックする。 */ function setEvent() { $('.TEST').blur(function() { var object = $(this); if (chkSurrogatePair($(this).val())) { alert('入力にサロゲートペアが含まれています。'); window.setTimeout(function() { object.focus(); object.select(); }, 1); } }); } /** * サロゲートペアが含まれているかをチェックする * 検査対象文字が上位もしくは下位サロゲートであればtrueを返す */ function chkSurrogatePair(str) { for ( var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); if ((0xD800 <= c && c <= 0xDBFF) || (0xDC00 <= c && c <= 0xDFFF)) { return true; } } return false; } |
また、ブラウザ側でもタイミングには迷いましたが、今回は入力欄からフォーカスが外れた時にチェックして、修正するまでフォーカスが外れないようにしてみました。
サンプルコードでは、クラス名がTESTというHTML要素のblurイベントに一括でチェックのイベントをセットしています(^^)/