Node.js源代码期望使用什么编码方式?

15

我已经进行了一些谷歌搜索,但是得到的结果都与编码字符串或文件有关。

我可以在UTF-8中编写我的Node.js JavaScript源代码吗?我可以在注释、字符串或变量名中使用非ASCII字符吗?

ECMA-262似乎需要UTF-16编码, 但是Node.js不会运行UTF-16编码的.js文件。但它可以运行UTF-8源代码并正确解释非ASCII字符。

那么这是设计上还是“意外”导致的?是否有规定支持UTF-8源代码?


1
我从未考虑过这个问题,但我在做任何事情时都会使用UTF-8,并且从未遇到过问题。 - undefined
1
我预计这不是一个Node.js的问题,而是一个V8的问题。 - undefined
1
我希望有人能够指出,比如说Node.js或V8文档中说明了哪些源编码是允许的。(Python示例:http://www.python.org/dev/peps/pep-0263/)。是的,我可以并且已经尝试过去摸索什么是有效的,但我想要一个更具体的答案。 - undefined
你正在链接到一个非常旧的规范版本(第三版于1999年发布,我们在去年6月刚刚发布了第六版)。当前版本在这里。要求是“unicode”(按照惯例,ASCII是unicode的子集,因为unicode中的前127个代码点与ASCII编码指定的相同)。 - undefined
@Mike'Pomax'Kamermans的回答是正确的。当前版本在这里。它说必须是Unicode,“不考虑外部源文本编码”。这意味着这是Node实现的细节。我找不到Node.js中的要求,但当然UTF-8现在是事实上的标准编码(甚至比2012年我提问时更加如此)。我们在公司所有的Node.js代码中都使用UTF-8,效果很好。 - undefined
显示剩余3条评论
2个回答

0

3
Unicode字符和UTF-8编码是不同的东西。实际上,标准似乎要求使用UTF-16而不是UTF-8(但实践中并非如此)。不过,能够确认Unicode字符是有效的变量名仍然是个好消息。 - undefined
8
虽然可以这样做,但我不能推荐像这样做:var Hͫ̆̒̐ͣ̊̄ͯ͗͏̵̗̻̰̠̬͝ͅE̴̷̬͎̱̘͇͍̾ͦ͊͒͊̓̓̐_̫̠̱̩̭̤͈̑̎̋ͮͩ̒͑̾͋͘Ç̳͕̯̭̱̲̣̠̜͋̍O̴̦̗̯̹̼ͭ̐ͨ̊̈͘͠M̶̝̠̭̭̤̻͓͑̓̊ͣͤ̎͟͠E̢̞̮̹͍̞̳̣ͣͪ͐̈T̡̯̳̭̜̠͕͌̈́̽̿ͤ̿̅̑Ḧ̱̱̺̰̳̹̘̰́̏ͪ̂̽͂̀͠ = 'Zalgo'; - undefined
4
JavaScript 的本地文本处理模型基于 UTF-16 代码单元,这是标准规定的。但它并未指定用于将源文件转换为这些单元的字节编码方式。 - undefined

0

我找不到文件说明Node将文件视为UTF-8编码的文档,但实验表明它似乎是这样的:

/* Check in your editor that this Javascript file was saved in UTF-8 */
var nonEscaped = "Планета_Зямля";
var escaped = "\u041f\u043b\u0430\u043d\u0435\u0442\u0430\u005f\u0417\u044f\u043c\u043b\u044f";
if (nonEscaped === escaped) {
  console.log("They match");
}

上面的例子打印出They match

非BMP注意事项:

请注意,UTF-8支持非BMP代码点(U+10000及以上),但在Javascript中存在复杂情况,它会自动将它们转换为代理对。这是语言的一部分:

/* Check in your editor that this Javascript file was saved in UTF-8 */
var nonEscaped = ""; // U+1F4A9
var escaped1 = "\ud83d\udca9";
if (nonEscaped === escaped1) {
  console.log("They match");
}
/* Newer implementations support this syntax: */
var escaped2 = "\u{1f4a9}";
if (nonEscaped === escaped2) {
   console.log("The second string matches");
}

这将打印出They matchThe second string matches


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接