考虑以下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的数据
2条答案
按热度按时间oo7oh9g91#
如果你把JavaScript移到一个外部的
.js
文件中,那么它就可以正常工作,所以这是HTML的限制,而不是Javascript的限制。显然,HTML解析器会发出
unexpected-null-character
错误,要么忽略它,要么用U+FFFD替换它。我相信相关的状态是脚本数据状态,它显式地调用了不允许的空字节。
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:字符串