Google Apps脚本Javascript字符串长度与预期不符

时间:2017-10-28 04:48:42

标签: google-apps-script

function test(){
  var log=(typeof Logger=='undefined')?console:Logger;
  log.log(" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ".length);
}

代码在Google Apps脚本中打印127.0,但在Chrome浏览器和Nodejs中返回128!

1 个答案:

答案 0 :(得分:1)

这是Rhino的一个已知错误,这是Google Apps脚本使用的JS引擎。当它直接输入字符串时,它不能正确处理“软连字符”字符0xAD;这个角色迷失了。您的字符串包含在“¬®”中。为简化示例,

"a­b".length

(在a和b之间使用软连字符)在浏览器中返回3,在GAS中返回2。

一种解决方法,如果你必须在字符串中使用软连字符,就像"a\u00ADb"

一样逃避它
"a\u00ADb" === "a­b"

在浏览器中评估为true,在GAS中评估为false

目前离线但可从Google缓存中获取的

This discussion是指此错误。我在下面引用

主题:回复:犀牛吃怪字符

嗨理查德,

对我而言,这显然是我在Rhino中的一个错误 重现它。我会尝试为这个问题准备Rhino补丁。

请在HtmlUnit中打开一个问题,以确保它不会丢失 (并确保我已正确识别根本原因)。

干杯, 马克。

- 网址:http://www.efficient-webtesting.com 博客:http://mguillem.wordpress.com

Richard Eggert写道:

  

我最近尝试使用HtmlUnit来加载已经存在的页面   使用HTMLZip(http://www.htmlzip.com/)“压缩”并发现   HtmlUnit可怕地破坏了输出。由于HTMLZip声称工作   在每个主流浏览器中都适当(我会接受他们的意见),我   想想这是HtmlUnit中的一个错误,因为它应该模仿它   “普通”浏览器的行为。

     

检查HTMLZip生成的页面的源代码,我发现了   HTMLZip使用包含不可打印字符的JavaScript字符串   没有逃脱他们。当我替换所有不可打印的字符   与其相应的\ x转义序列,HtmlUnit能够   处理页面。但是,HtmlUnit无法处理页面   已经应用了多层HTMLZip压缩。

     然后我做了一个实验,我在其中创建了一个非常简单的ISO-8859-1   仅包含声明变量的SCRIPT标记的HTML文档   “x”被分配了一个包含字符0到255的字符串,   仅转义空格和引号字符(以避免语法   错误)。我通过HtmlUnit运行它并检查了“x”的值   变量。我发现每个角色都保存完好,除了   0xAD字符,对应Unicode SHY“soft hyphen”   ISO-8859-1中的字符。这个角色很简单   串!

     

为了缩小0xAD被丢弃的位置,我用了一个   ScriptPreProcessor在将脚本传递给Rhino之前捕获脚本。   我检查了捕获的脚本,发现0xAD仍然存在   在文本中,它向我表明该角色正在被删除   由Rhino而不是HTML解析器。

     

我应该为此提交错误报告吗?此外,任何人都可以想到一个   快速解决方法?我能想到的就是我的头脑   编写一个自动转换SHY的ScriptPreProcessor   转义序列的字符,但没有实际解析   脚本,我最终可以转义出现在字符串之外的字符   文字。

     

Rich Eggert   技术人员   Proteus Technologies,LLC