字符串中的空字符

时间:2012-12-04 08:22:55

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

考虑这个字符串:

var s = "A\0Z";

其长度为3,由s.length给出。使用console.log,您可以看到字符串未被剪切,s[1]""s.charCodeAt(1)0

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

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

由于这是关于标准的问题,因此需要参考。

3 个答案:

答案 0 :(得分:15)

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

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

规范正式说:

  

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

此外:

  

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

关于NUL字节:

  

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

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

对于(有效)“String Single Character Escape Sequences”的参考,请查看ECMAScript Language spec section 7.8.4。该段末尾有一个表格,列出了上述逃逸序列。

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

你问的是alert()方法的非统一(跨浏览器)行为,所以它与Script对象和ECMAscript规范没有任何关系,而是关于alert()如何显示字符串对象。

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

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

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