Windows平台Node.js实现复制任意文本到剪贴板

最新有个需求,想在Windows平台上用Node.js实现复制功能,实现过程中踩了一些坑,总结一下,做个记录。

首先,这个需求显然很小,也不用考虑跨平台,就打算自己实现一下。Node.js本身并没有类似函数,而CMD命令,应该是有类似实现的:

echo biebuxin | clip

Node.js代码可以这么写:

const { exec } = require('child_process');

exec('echo biebuxin | clip');

预期结果应该是biebuxin这个字符串被复制到剪贴板了。粘贴后却发现,复制的不止biebuxin,后面多了一个空格和换行。

不想要后面多余的空格和换行,怎么办?换一种写法:

exec('clip').stdin.end('biebuxin');

这样粘贴出来的,不多不少,就是biebuxin。

你以为就结束了么?Naive…

当你想要复制中文时,比如:

exec('clip').stdin.end('别不信');

粘贴出来,会发现是乱码!

为什么会出现乱码?

是编码的问题。

在CMD中执行chcp,结果是“活动代码页: 936”。这表明,CMD默认是GBK编码。而Node.js默认是UTF-8编码——这种编码差异,对中文而言,肯定会出问题的嘛。

然后尝试把编码改成GBK,却发现,Node.js并不支持GBK编码。

这个时候,得借助iconv-lite这个强大的编码转换工具了,代码如下:

const { exec } = require('child_process');
const iconv = require('iconv-lite');

exec('clip').stdin.end(iconv.encode('别不信', 'gbk'));

粘贴出来,完美。

以上。