非ascii char作为参数

时间:2011-09-25 08:26:57

标签: javascript node.js utf-8

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

1 个答案:

答案 0 :(得分: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]));

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

$ node test.js Ā
0: 'node'
1: '/home/tjc/temp/test.js'
2: 'Ā'
length: 1
code: 256
size: 2

......这是正确的。

在使用chcp 65001和Lucida Console的Windows 7上,我得到了:

C:\tmp>node temp.js Ā
0: 'node'
1: 'C:\tmp\temp.js'
2: 'A'
length: 1
code: 65
size: 1

请注意,Ā在此过程中的某个时刻变为A

正如我在关于这个问题的评论中所说,我只能假设Lucida Console或cmd.exe处理UTF-8或者node.exe处理Unicode的问题存在问题。 Windows上的控制台(我使用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版本的问题。

相关问题