在JavaScript字符串字面量中存储空字节

g6baxovj  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(126)

考虑以下HTML:

<!DOCTYPE html>
<html>
    <body>
        <script>
            const a = " ... ";

            for (let i = 0; i < a.length; ++i) {
                console.log(a.charCodeAt(i));
            }
        </script>
    </body>
</html>

字符串
其中字符串中的...实际上是ASCII字符NUL(0),SOH(1),STX(2)。此文件保存为UTF-8(唯一有效的HTML5编码)。
当我在Firefox或Chrome中打开它时,它会打印以下内容:

32
65533
1
2
32


然而,根据我对规范的阅读,我应该能够存储空字节:

StringLiteral ::
    " DoubleStringCharactersopt "
    ' SingleStringCharactersopt '

DoubleStringCharacters ::
    DoubleStringCharacter DoubleStringCharactersopt

DoubleStringCharacter ::
    SourceCharacter but not one of " or \ or LineTerminator
    <LS>
    <PS>
    \ EscapeSequence
    LineContinuation

SourceCharacter ::
    any Unicode code point



从U+0000到U+10 FFFF的所有Unicode代码点值,包括代理代码点,都可以在ECMAScript语法允许的情况下出现在ECMAScript源文本中。
那么为什么它不允许我存储空字节呢?
(Yes我知道所有的影响,请不要告诉我,我不应该这样做。
编辑:要明确的是,字符串是 * 不是 * " \x00\x01\x02 "。它是这样的:
x1c 0d1x的数据

oo7oh9g9

oo7oh9g91#

如果你把JavaScript移到一个外部的.js文件中,那么它就可以正常工作,所以这是HTML的限制,而不是Javascript的限制。
显然,HTML解析器会发出unexpected-null-character错误,要么忽略它,要么用U+FFFD替换它。
我相信相关的状态是脚本数据状态,它显式地调用了不允许的空字节。

xytpbqjk

xytpbqjk2#

我不希望一个文本文件能够携带代码点NUL(以及其他几个控制字符)。这也与no named character reference (aka entity) available for U+0000一致。这很可能是一个预防措施,以免混淆(旧)处理NUL-terminated strings的实现。
即使在XHTML中将<script>部分封装到<![CDATA[中也不允许使用U+0000,但XML本身也不允许使用U+0000。
将HTML与JS分离是最好的方法,但即使这样,您也可能希望将JS与二进制数据分离。将控制字符视为String也是值得怀疑的做法,因为您无法预期文本将被解释为哪种编码-最好使用byte arrays

var bytes= new Array( 0, 1, 2 );

字符串

相关问题