之前在用Windows的cmd命令行窗口执行PHP脚本时,遇到中文时会乱码,但是因为不影响程序的运行结果,因此没有太过放在心上。今天在将数据往MySQL中保存时,因为字段的值有中文,导致脚本执行时中文乱码,插入出错。排查问题时,程序编码使用的是UTF-8,数据库编码也是UTF-8,所以想到的是可能是程序执行环境的编码不是UTF-8。
网上搜索资料发现,在Windows中,cmd 命令行窗口默认采用的编码不是UTF-8,因此在运行一些UTF-8编写的程序文件时,控制台输出的中文就是乱码。修改编码的方法是使用 CHCP 命令。CHCP 是MD DOS中的命令,用来显示或设置活动代码页编号的。语法是:
CHCP [num]
其中num指定的是代码页的编号。这个参数是可选的,在默认的cmd窗口中,如果我们只输入chcp,显示的将类似:
其中 936 就是各种编码语言的的编号。
以下是几种常用的编码:
936 GBK(简体中文,一般情况下为默认编码) 437 MS-DOS 美国英语 65001 utf-8 1252 拉丁 1 字符 (ANSI)
回到文章开头的问题,我们要设置 cmd 命令行窗口的编码格式为UTF-8,步骤如下:
1. 运行cmd
2. 在命令行中输入 chcp 65001 回车, 控制台会切换到新的代码页
3. 在标题栏上点击右键,选择“属性(P)”菜单,在打开的界面中选择“选项”标签页,在下方显示“当前代码页”为“65001 (UTF-8)”; 然后选择“字体”标签页,把字体设置为Lucida Console,然后点击确定,关闭属性窗口。
如果要设置回默认编码,步骤如下:
1. 运行CMD
2. 在命令行中输入 chcp 936 回车,控制台会切换到新的代码页
3. 这时该代码页的编码已经换为默认,但关闭后重新打开还是其他编码,可以在标题栏上点击右键,选择“属性(P)”菜单,在打开的界面中选择“选项”标签页, 选中“丢弃旧的副本”,然后点击确定,关闭属性窗口。
最后,需要注意,这样设置有个问题是:
如果步骤1中运行CMD窗口是通过开始菜单里启动的,那么会出现:
1. 如果先启动CMD窗口,然后运行UTF-8编码格式bat文件,不会输出乱码;
2. 如果直接双击UTF-8编码格式bat文件运行,启动的CMD窗口编码仍为windows默认,仍然会输出乱码。
解决办法是:
步骤1中运行CMD窗口 通过按住Shift+鼠标右键,启动CMD窗口,使用命令chcp 65001后,右键CMD窗口标题栏,修改属性里的字体和字体大小。
此时即使是双击UTF-8编码格式bat文件也不会输出乱码了。