最新有個需求,想在Windows平臺上用Node.js實現複製功能,實現過程當中踩了一些坑,總結一下,作個記錄。javascript
首先,這個需求顯然很小,也不用考慮跨平臺,就打算本身實現一下。Node.js自己並無相似函數,而CMD命令,應該是有相似實現的:java
echo biebuxin | clip
複製代碼
Node.js代碼能夠這麼寫:shell
const { exec } = require('child_process');
exec('echo biebuxin | clip');
複製代碼
預期結果應該是biebuxin這個字符串被複制到剪貼板了。粘貼後卻發現,複製的不止biebuxin,後面多了一個空格和換行。函數
不想要後面多餘的空格和換行,怎麼辦?換一種寫法:工具
exec('clip').stdin.end('biebuxin');
複製代碼
這樣粘貼出來的,很少很多,就是biebuxin。ui
你覺得就結束了麼?Naive...編碼
當你想要複製中文時,好比:spa
exec('clip').stdin.end('別不信');
複製代碼
粘貼出來,會發現是亂碼!code
爲何會出現亂碼?ip
是編碼的問題。
在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實現複製任意文本到剪貼板