【问题标题】:Null character in strings字符串中的空字符
【发布时间】:2012-11-21 19:54:21
【问题描述】:

考虑这个字符串:

var s = "A\0Z";

它的长度是 3,由 s.length 给出。使用console.log,你可以看到字符串没有被剪断,s[1]""s.charCodeAt(1)0

当您在 Firefox 中提醒它时,您会看到 AZ。当您在 Chrome/Linux 中使用 alert(s) 提醒它时,\0 会终止字符串,您会看到 A

我的问题是:应该 浏览器和 Javascript 引擎做什么? Chrome 在这里有问题吗?是否有文件定义应该发生什么?

因为这是一个关于标准的问题,所以需要参考。

【问题讨论】:

  • 在 Chrome 23 控制台中我看到了AB
  • @JamesAllardice 是的,如果你写 console.log(s, s.length, s[0], s[1], s[2]) 你会看到整个字符串。 Chrome 中的问题是在使用alert(s) 时。
  • @dystroy alerts 非常依赖于操作系统,实际上没有办法在浏览器之间实现标准化
  • 肯定可以。通过遵循标准。 \0 不是可识别的转义字符 :)
  • 你真的在 Windows 或 Linux 上使用 Chrome 吗?也许不同的窗口管理器对待\0的方式不同,你可能看到不同的结果...

标签: javascript string google-chrome unicode null-terminated


【解决方案1】:

浏览器应该做的是分别跟踪字符串及其长度,因为标准中不存在空终止符。 (字符串只是一个有长度的对象)。

Chrome 似乎要做的(我相信你的话)是使用标准 C 字符串函数,它以 \0 终止。回答您的一个问题:是的,这对我来说构成了 Chrome 处理 alert() 函数的错误。

规范说:

字符串文字是用单引号或双引号括起来的零个或多个字符。每个字符都可以用一个转义序列来表示。除了右引号字符、反斜杠、回车、行分隔符、段落分隔符和换行符之外,所有字符都可以按字面意思出现在字符串文字中。任何字符都可能以转义序列的形式出现。

还有:

字符串文字代表字符串类型的值。文字的字符串值 (SV) 是根据字符串文字的各个部分贡献的字符值 (CV) 来描述的。

关于NUL字节:

EscapeSequence :: 0 [lookahead ∉ DecimalDigit] 的 CV [字符值] 是 字符(Unicode 值 0000)。

因此,一个 NUL 字节应该只是“又一个字符值”并且没有特殊含义,这与它可能以 SV(字符串值)结尾的其他语言相反。

有关(有效)“字符串单字符转义序列”的参考,请查看ECMAScript Language spec section 7.8.4。段落末尾有一个表格,列出了上述转义序列。

打算编写 Javascript 引擎的人可能会从中学到:不要使用 C/C++ 字符串函数。 :)

【讨论】:

  • 不是相关评论:“如果 \ 后跟一个十进制数 n,其第一个数字不是 0”.. 这里不是这种情况,请参阅我的帖子的编辑
  • 您阅读了整个部分吗?看起来您只阅读了“注意”...它具有“如果 i 为零,则返回由 字符(Unicode 值 0000)组成的 EscapeValue。”和“\0 表示 字符,后面不能跟十进制数字。”,更不用说其他关于转义的一般信息......
  • 你的意思是伪代码吗?是的,我读过。该段没有添加对这个问题有用的新信息。至少我看不到任何内容,因为 NUL 字符已经隐含在我引用的字符串文字部分中。关心启发我为什么要把它放在我的答案中?
  • OT:您是否将其作为错误报告给 Chromium 或 V8?我想看看。 :)
  • @AlvinWong 我输入了issue 164126
【解决方案2】:

Javascript 像对待任何其他字符一样处理空字符,您的问题是如何在 cosole 或警报中显示它,它在不同的浏览器中有所不同,对此没有标准,所以 chrome 是可以的。

【讨论】:

  • 我不明白为什么这被否决了。虽然紧凑,但它是尼尔森答案之前最正确的答案,纳尔逊的答案更详细。
【解决方案3】:

您询问的是 alert() 方法的非统一(跨浏览器)行为,因此它与 Script 对象和 ECMAscript 规范无关,它是关于 alert() 如何显示 String 对象。

alert()Window对象的一个​​方法,ECMAscript没有定义它(它只是告诉宿主环境可以提供全局对象作为窗口对象)。

但它恰好是 w3c spec that defines alert() 行为,不幸的是它非常简陋,并且没有提供有关如何显示嵌入空字符的消息的任何提示。

因此,与规范中未指定的任何其他细节一样,此行为将留给浏览器自己的实现。

【讨论】:

  • 认为它定义了如何处理字符串文字中的 NUL 字符,重新定义将是多余的,不是吗?
  • 引用的“w3c 规范”本身说:“这是一份草案文件,可能随时被其他文件更新、替换或废弃。除了正在进行的工作之外,引用这份文件是不恰当的。”此外,它只说alert() 方法应“向用户显示给定的消息”。它没有指定如何解释控制字符。所以停在 NUL,虽然质量很差,但并不违反任何规范。
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 2020-10-30
  • 2011-11-27
  • 2013-01-04
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多