代码之家  ›  专栏  ›  技术社区  ›  Peter Wone

什么会导致在节点JavaScript中错误报告字符串长度?

  •  1
  • Peter Wone  · 技术社区  · 2 年前

    在调试器中进行检查时 html 在以下代码中,以结尾 </html>\n 如预期,但在浏览器中收到的最后六个字符( /html> )缺少。

    let html = this.code!.asHtml();
    response.writeHead(200, {
        "Content-Type": "text/html; charset=utf-8",
        "Content-Length": html.length
    });
    response.end(html);
    

    当我这样注释内容长度标题时

    let html = this.code!.asHtml();
    response.writeHead(200, {
        "Content-Type": "text/html; charset=utf-8",
        //"Content-Length": html.length
    });
    response.end(html);
    

    传递的页面不再被截断。世界跆拳道联盟?!这意味着html。长度报告的字符数不正确。这可能与角色集有关,但我不确定如何继续,希望您能提供建议。

    1 回复  |  直到 2 年前
        1
  •  1
  •   t.niese    2 年前

    Content-Length 是正文的字节数,而不是字符数。

    html。长度报告的字符数不正确。

    .length 正在报告字符数(如果是UTF-8)或更精确的UTF-16代码单元。

    字符串对象的length属性包含字符串的长度,以UTF-16代码单位表示。length是字符串实例的只读数据属性。。。

    与您的案例无关,但也需要了解:

    ... 长度返回的值可能与字符串中的实际字符数不匹配

    回到您的问题:在UTF-8或16中,一个字符可能被多个字节编码。所以 html.length 可能确实太小了。使用 Buffer.byteLength(html, 'utf8') 相反