解决Node.js的命令行输出中文乱码问题(也适用于Electron)

2019-02-24 09:47:09

一般我们的js文件都是试用utf8编码保存的,但是中文windows的命令行一般默认使用cp936编码(就是gbk),这样我们用js代码 console.log('中文');输出日志的时候,会发现输出的是乱码。

网上有提供一些解决方案,典型的就是用iconv或iconv-lite,把这些中文字符串先转成gbk再输出。
但是这个方案我试了多次,在win10的命令行下,utf8的字符串是成功转成了gbk字符串了(通过打印Buffer可以见到),但是输出还是乱码。
另外,这个方案也需要自行再封装一个日志函数,或者在需要打印中文的地方自行转换,用起来也相对麻烦。

换过另一种思路,让cmd可以输出utf8的字符串呢?
当然是可以的,通过命令chcp 65001就可以把当前命令行的

输出转成utf8编码的。
现在的问题就是剩下如何在js代码里启用这条命令了,花了不少时间,发现此路不通,那么只能从代码外来解决。
解决方式也很简单,就是修改我们的package.json脚本里的script,在需要使用到utf8的命令前先运行下编码转换的命令,参考如下:

"script": {    "start": "chcp 65001 && node ."}

运行一下,正确输出中文了。

win7下的补充

上述的方案针对win10可以正常工作,但是win7下的话,仍然是会出现乱码,这个就不是因为字符编码的原因了,是cmd的默认字体导致的,我们需要修改下默认字体。
打开cmd,在左上角的图标右键点击,出来右键菜单,选择属性,在弹出的设置框里,选中字体tab,然后把字体修改成Consolas或者Lucida Console,确定之后,熟悉的中文又出现了。






  • 2019-12-03 15:50:00

    html5 audio stop功能

    html5并没有提供停止功能,我们需要通过其他方式来实现这个问题,下面我们来看下神仙般的操作。

  • 2019-12-03 16:33:49

    hapi,nuxtjs跨域请求

    简单请求 与 预检请求,Fetch 与 CORS 的一个有趣的特性是,可以基于 HTTP cookies 和 HTTP 认证信息发送身份凭证。一般而言,对于跨域 XMLHttpRequest 或 Fetch 请求,浏览器不会发送身份凭证信息。如果要发送凭证信息,需要设置 XMLHttpRequest 的某个特殊标志位。

  • 2019-12-03 16:36:03

    跨域资源共享 CORS 详解

    阮一峰大哥的文章写的不错,推荐,也推荐他的整个王章,大家可以去看一下啊。

  • 2019-12-03 16:37:01

    去除options,减少options的访问

    因为跨域请求,浏览器可能(后面讲)会发送一次options请求,如果处理不好,跨域还是会gg的。 之前很少涉及跨域,涉及也是简单请求(下面阮老师文章中区别热简单请求和复杂请求),所以基本不会很少关注options。后面就遇到坑了,下面讲讲注意点。

  • 2019-12-04 10:46:26

    nuxt.js项目中全局捕获异常并生成错误日志全过程

     需求:客户在使用过程中页面报错时,可以生成错误记录传回服务器,以便改进。   步骤:     一.全局捕获异常,     二.发送到服务端,     三.生成错误日志。   一.全局捕获异常 如图,vue提供了errorHandle这个方法来处理全局异常,更多详细内容参见官网。

  • 2019-12-04 10:47:59

    nuxt.js项目中全局捕获异常并生成错误日志全过程

     需求:客户在使用过程中页面报错时,可以生成错误记录传回服务器,以便改进。   步骤:     一.全局捕获异常,     二.发送到服务端,     三.生成错误日志。   一.全局捕获异常 如图,vue提供了errorHandle这个方法来处理全局异常,更多详细内容参见官网。