【问题标题】:non-ascii char as arguments非 ascii 字符作为参数
【发布时间】:2011-09-25 08:26:57
【问题描述】:

printargv.js:

console.log(Buffer.byteLength(process.argv[2]));

在 cmd.exe(使用 chcp=65001,font='Lucida Console')中,我运行:

node printargv.js Ā 

(注:Ā的unicode码位为U+0100。)脚本输出:

1

我希望脚本打印一个大于 1 的数字,但事实并非如此。有谁知道为什么?

编辑: 在我尝试以下代码后,我认为节点“解析”cmd.exe 的初始参数不正确:

var i = require('readline').createInterface(process.stdin,process.stdout);

i.question('char: ', function(c){
  console.log( Buffer.byteLength(c) );
  i.close();
  process.stdin.destroy();
});

输出为 2

【问题讨论】:

  • @Juhana:问题或多或少是,“为什么它应该打印 2 却打印 1?”。
  • 我在 Ubuntu 上使用 UTF-8 在终端中得到 2。如果我输出字符的字符代码,我会得到正确的值(256)。 (尝试输出process.argv[2].charCodeAt(0)。)我只能假设Lucida Console 存在一些问题(请注意,该页面并未声称支持代码页65001),与大多数字体一样,它对Unicode 的支持不完整。

标签: javascript node.js utf-8


【解决方案1】:

您的程序没有收到Ā,而是收到了A。我用这个程序来测试:

var n;
for (n = 0; n < process.argv.length; ++n) {
    console.log(n + ": '" + process.argv[n] + "'");
}
console.log("length: " + process.argv[2].length);
console.log("code: " + process.argv[2].charCodeAt(0));
console.log("size: " + Buffer.byteLength(process.argv[2]));

在控制台中使用 UTF-8 的 Ubuntu 上,我得到:

$ node test.js Ā
0:“节点”
1:'/home/tjc/temp/test.js'
2:'Ā'
长度:1
代码:256
尺寸:2

...这是正确的。

在使用 chcp 65001 和 Lucida 控制台的 Windows 7 上,我得到:

C:\tmp>node temp.js Ā
0:“节点”
1: 'C:\tmp\temp.js'
2:'一个'
长度:1
代码:65
尺寸:1

请注意,Ā 在某些时候变成了A

正如我在对该问题的评论中所说,我只能假设 Lucida Console 或 cmd.exe 对 UTF-8 的处理,或者 node.exe 从 Windows 上的控制台处理 Unicode 存在一些问题(我用的是pre-built 0.5.7 version)。


更新:这可能是 NodeJS 人员需要考虑的事情,因为 Windows 似乎可以自行解决。如果我将此代码放在test.vbs 文件中:

WScript.Echo WScript.Arguments(0)
WScript.Echo AscW(WScript.Arguments(0))

我得到了正确的结果:

C:\tmp>cscript /nologo test.vbs Ā
一个
256

...建议终端将参数正确传递给程序。所以这可能是 Windows node.exe 构建的问题。

【讨论】:

  • 为了避免拉丁字符之间的交换,我尝试了另一组代码页大于 0x024f(latin-extend-b 的结尾)的字符,例如CJK Ideograph 1(from 0x4e00),输出还是错误的。
  • @user943702:我认为这是 NodeJS 人员需要考虑的事情,请参阅上面的更新。
  • 我以前做过同样的事情(使用 cscript 和 java)。它在相同的 cmd.exe 中产生正确的输出(设置为 65001,lucida 控制台)。这主要是node.exe的问题(2011.09.16 v0.5.7(不稳定))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多