見落としていた。
アルファベット禁止でjavascriptを書いてみた - sub Diary (仮)…ね、簡単でしょう?
お詫びというのも変だけど、もっと簡単にしてみた。
これで、任意のJavaScriptから数字と記号以外を取り除けます。アルファベットだけではなく、漢字も。
二種類作りました。まず一つ目。
ソースは至ってシンプル。
$_01234567 = function(str){
return [
'(0)[\'constructor\'][\'constructor\'](\'',
str.replace(/\'/g, '\\\'').replace(/[\u0080-\uffff]/g, function(m0){
return '\\\\u' + (0x10000 + m0.charCodeAt(0)).toString(16).substr(1)
}),
'\')()'
].join('').replace(/[\x00-\x20A-Za-z]/g, function(m0){
return '\\' + m0.charCodeAt(0).toString(8)
});
}
id:reosabloの手法ほぼそのままですが、かな漢字にも対応しています。
もう一つは、こちら。
どうやっているかは、ソースを参照あれ。
$_76543210 = function(str){
var ary = [];
for (var i = 0, l = str.length; i < l; i++) ary[i] = str.charCodeAt(i);
return [
'(0)[\'constructor\'][\'constructor\'](\'a\',\'',
'var c=[];for(var i=0;i<a.length;i++)c[i]=String.fromCharCode(a[i]);',
'eval(c.join(\'\'))'.replace(/\'/g, '\\\''),
'\')'
].join('').replace(/[\x00-\x20A-Za-z]/g, function(m0){
return '\\' + m0.charCodeAt(0).toString(8)
}) + '([' + ary.join(',') + '])';
}
どちらも Firefox 3.0.10, Safari 3.2.3, Opera 9.64, Chrome 2, IE7 で動作確認してあります。IE7の場合、promptで警告が出ますが一時的に許可すればちゃんと上記サンプルが動きます。
Enjoy!
(0)['\143\157\156\163\164\162\165\143\164\157\162']['\143\157\156\163\164\162\165\143\164\157\162']
('\141','\166\141\162\40\143=[];
\146\157\162(\166\141\162\40\151=0;
\151<\141.\154\145\156\147\164\150;\151++)
\143[\151]=\123\164\162\151\156\147.\146\162\157\155\103\150\141\162\103\157\144\145(\141[\151]);
\145\166\141\154(\143.\152\157\151\156(\'\'))')
([97,108,101,114,116,40,39,68,97,110,32,116,104,101,32,74,97,118,97,12473,12463,12522,12503,12479,12449,39,41])
これ、実はSafariというかWebKitのバグです。
本blogはEUC-JPなのですが、この時に限ってWebkitはU+0092(backslash)をU+00A5に変換してしまうのです。UTF-8の場合には生じません。しかしEUC-JPの場合、実体参照しても化けます><
http://d.hatena.ne.jp/ykmbpp/20080526/1211785142
str.replace(/\u00A5/g, '\u0092');
をかますことで対処しました。
Dan the Man with Too Many Encodings to Fix