提问人:Timmmm 提问时间:10/31/2023 最后编辑:Timmmm 更新时间:11/13/2023 访问量:74
在 Javascript 字符串文本中存储 null 字节
Storing null bytes in Javascript string literals
问:
请考虑以下 HTML:
<!DOCTYPE html>
<html>
<body>
<script>
const a = " ... ";
for (let i = 0; i < a.length; ++i) {
console.log(a.charCodeAt(i));
}
</script>
</body>
</html>
其中 in in the 实际上是 ASCII 字符 (0)、(1)、(2)。此文件保存为 UTF-8(唯一有效的 HTML5 编码)。...
NUL
SOH
STX
当我在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
和
在 ECMAScript 语法允许的情况下,从 U+0000 到 U+10FFFF 的所有 Unicode 码位值(包括代理码位)都可能出现在 ECMAScript 源文本中。
那么为什么它不允许我存储一个空字节呢?
(是的,我知道所有的含义,请不要告诉我我不应该这样做。
编辑:需要明确的是,字符串不是.它是这样的:" \x00\x01\x02 "
答:
如果您将 Javascript 移动到外部文件,那么它确实可以正常工作,因此这是 HTML 的限制,而不是 Javascript。.js
显然,HTML 解析器会发出一个意外的 null 字符
错误,并忽略它或将其替换为 U+FFFD。
我相信相关状态是脚本数据状态,它明确地将空字节调用为不允许的。
我不希望文本文件能够携带代码点 NUL (以及其他几个控制字符)。这也与 U+0000 没有可用的命名字符引用(又称实体)一致。这很可能是一种预防措施,以免混淆处理以 NUL 结尾的字符串的(旧)实现。
甚至把你的部分封闭在<里!XHTML 中的 CDATA[
不允许 U+0000。但话又说回来,XML 本身不允许 U+0000。<script>
将 HTML 与 JS 分开是最好的方法,但即便如此,您可能也希望将 JS 与二进制数据分开。将控制字符视为一种做法也是值得怀疑的,因为您不能期望该文本将以哪种编码进行解释 - 最好使用字节数组:String
var bytes= new Array( 0, 1, 2 );
评论
<head><meta charset="utf-8"></head>