Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 字符串中的空字符_Javascript_String_Google Chrome_Unicode_Null Terminated - Fatal编程技术网

Javascript 字符串中的空字符

Javascript 字符串中的空字符,javascript,string,google-chrome,unicode,null-terminated,Javascript,String,Google Chrome,Unicode,Null Terminated,考虑以下字符串: var s = "A\0Z"; 其长度为3,由s.length给出。使用console.log可以看到字符串没有被剪切,并且s[1]是”和s.charCodeAt(1)是0 当你在Firefox中提醒它时,你会看到AZ。当您在Chrome/Linux中使用alert(s)向它发出警报时,\0终止字符串,您将看到A 我的问题是:浏览器和Javascript引擎应该做什么?这里有镀铬手推车吗?是否有一份文件定义了应该发生什么 因为这是一个关于标准的问题,所以需要一个参考。浏览器应

考虑以下字符串:

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的作用(我相信你的话)是使用以\0结尾的标准C字符串函数。回答你的一个问题:是的,这对我来说是Chrome处理
alert()
函数的一个缺陷

规范正式规定:

字符串文字是包含在单引号或双引号中的零个或多个字符。每个字符都可以用转义序列表示。除结束引号字符、反斜杠、回车、行分隔符、段落分隔符和换行符外,所有字符都可以以字符串文字形式出现。任何字符都可能以转义序列的形式出现

此外:

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

关于NUL字节:

EscapeSeSequence::0[lookahead]的CV[字符值]∉ 小数位数]是一个字符(Unicode值0000)

因此,NUL字节应该只是“另一个字符值”,并且没有特殊意义,这与可能以SV(字符串值)结尾的其他语言不同

有关(有效)“字符串单字符转义序列”的参考,请参阅。本段末尾有一个表格列出了上述转义序列


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

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

您询问的是
警报()
方法的非统一(跨浏览器)行为,因此,它与脚本对象和ECMAscript规范没有任何关系,而是关于
alert()
如何显示字符串对象

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

但这恰好是一种行为,不幸的是,它非常令人震惊,并且没有提供任何关于嵌入空字符的消息应该如何显示的提示


因此,与规范中未指定的任何其他细节一样,这种行为被浏览器自己的实现忽略了。

在Chrome 23控制台中,我看到
AB
@jamesalardice yes,如果您编写console.log(s,s.length,s[0],s[1],s[2]),您将看到整个字符串。Chrome的问题在于,当使用
alert
@dystroy
alert
s时,它们非常依赖于操作系统,因此没有一种方法可以在浏览器中实现标准化,即使它们可以。通过遵循标准\0不是可识别的转义字符:)您实际在Windows或Linux上使用Chrome吗?可能不同的窗口管理器对
\0
的处理方式不同,您可能会看到不同的结果…而不是相关的注释:“If\后面跟一个十进制数n,其第一个数字不是0”。。这里的情况不是这样的,请看我的帖子的编辑。你读了整个部分了吗?看起来您只读取了“注释”…它有“如果i为零,则返回由字符(Unicode值0000)组成的EscapeValue”和“\0表示字符,后面不能跟十进制数字”。更不用说其他有关转义的一般信息了…您指的是伪码吗?是的,我读过。该段没有增加对这一问题有用的新资料。至少我看不到,因为NUL字符已经隐式地包含在我引用的字符串文本部分中。你能告诉我为什么我要把它放在我的答案里吗?OT:你有没有把它作为一个bug报告给Chromium或V8?我想看看。:)@AlvinWong我认为它定义了如何处理字符串文本中的NUL字符,重新定义是多余的,不是吗?引用的“w3c规范”本身说:“这是一个草稿文档,可能随时被其他文档更新、替换或废弃。引用此文档作为正在进行的工作之外的内容是不合适的。”此外,它只说明
alert()
方法应“向用户显示给定的消息”。它没有规定如何解释控制字符。所以停在NUL,虽然质量很差,但并没有违反任何规范。我不明白为什么这被否决了。虽然简洁,但在尼尔森的答案之前,这是最正确的答案,尼尔森的答案更详细地说明了这一点。