最新有个需求,想在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'));
粘贴出来,完美。
个人技术博客 biebu.xin,原文链接——Windows平台Node.js实现复制任意文本到剪贴板