八進エスケープ

八進エスケープ

[1] B 互換性 (Compatibility) ( 版) <http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/B_Compatibility.html#section-B.1.2>

[2] >>1 に従えば \069 みたいなのは八進数のエスケープではないことになってしまいますが、 ブラウザで試してみると \06 + 文字 9 として処理されます。

[3] () が8個ないときの \8 の解釈

<http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0Aif%20(%22%5Cx08%22.match%20(%2F%5C8%2F))%20%7B%0A%20%20document.write%20(%22U%2B0008%22)%3B%0A%7D%20else%20if%20(%228%22.match%20(%2F%5C8%2F))%20%7B%0A%20%20document.write%20(%22U%2B0038%20DIGIT%20EIGHT%22)%3B%0A%7D%20else%20if%20(%22%5C%5C8%22.match%20(%2F%5C8%2F))%20%7B%0A%20%20document.write%20(%22U%2B005C%20REVERSE%20SOLIDUS%2C%20U%2B0038%20DIGIT%20EIGHT%22)%3B%0A%7D%20else%20%7B%0A%20%20document.write%20(%22Unknown%22)%3B%0A%7D%0A%3C%2Fscript%3E>

WinIE 7SafariChrome: U+0038 DIGIT EIGHT

Opera 9.61: U+0008

Firefox 3: U+005C REVERSE SOLIDUS, U+0038 DIGIT EIGHT

[4] 文字列リテラルでの \8 の解釈

<http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0D%0Adocument.write%20(encodeURIComponent%20(%22%5C8%22))%3B%0D%0A%3C%2Fscript%3E>

どのブラウザでも U+0038 DIGIT EIGHT

[5] ES3 によれば \nn が () の数より多いと SyntaxError ですが (15.10.2.9 の算法、または 15.10.2.11 の informative note)、 実際にはどのブラウザでも八進エスケープとして解釈されます。

<http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0D%0Adocument.write%20(%22%5Cx04%22.match(%2F%5C4%2F)%3F1%3A0)%3B%0D%0A%3C%2Fscript%3E>

[6] ちなみに Perl ではエラーになります。 ES3 には正規表現内の () の数が、という風に書かれていて、そこより前、とは言っていません。 Perl でも、 /\5((((()))))/ のように括弧が後から出てきてもエラーにはなりません。

[7] 文字クラス内の \n の解釈。

ES3 によれば \0 以外は SyntaxError ですが、実際にはどのブラウザでもエスケープとして解釈されます。

\1 <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0D%0Adocument.write%20(%22a%5Cx01%22.match(%2F(a)%5B%5C1%5D%2F)%3F1%3A0)%3B%0D%0A%3C%2Fscript%3E>: どのブラウザでも U+0001 として解釈されます。

\8 <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cscript%3E%0Adocument.write%20(%22a8%22.match(%2F(a)%5B%5C8%5D%2F)%3F1%3A0)%3B%0A%3C%2Fscript%3E>: Opera 以外では U+0038 と、 Opera では U+0008 と解釈されます。

Firefox でも U+0038 とだけみなされます。