关于PHP CLI输入的问题,在两个月前的时候做了一个小东西,遇到的一个问题,当时并未找到解决的办法,今天中午的时候偶然翻到一篇文章,使得之前的问题得到了解决。
简答的来说一下吧,就是在使用CLI做中文输入时,会出现不可避免的乱码:
$a = fgets(STDIN); var_dump($a);
第一个为php7.4,第二个php5.6
从上面的可以看出来,在高版本的情况下,中文的输入会导致输出变为乱码,但低版本的却不会有这样的问题,下面会说明为何
起初也使用过一些转换编码的,通通不行,转换完,高本版也没有成功的转换,低版本时也会输出乱码,这些就不展示了。
在今天中午,看到的文章里【传送门】,恰好说到了这个问题,其中这个作者是在官方BUG问题里找到的答案【传送门】,具体的使用是高版本的需要通过sapi_windows_cp_set
去设置当前的windows字符编码codepage
,此时问题来了,就是上面的高低版本原因不同的问题。
sapi_windows_cp_set 官方文档传送门
通过一段代码来查看不同的PHP版本下对应的windows的字符编码:
$cmd = "chcp"; //命令行语句 exec($cmd,$result,$state); ## 执行shell命令 echo explode(":",$result[0])[1] ; ## 获取当前php对应的系统编码
第一个是7.4版本,编码为65001对应UTF-8,第二个是5.6版本,编码是936对应的是GBK
然后我们查看一下我们输入的字符的编码:
在5.6和7.4版本里,都输出了EUC-CN
查阅文档可以知道,EUC-CN
是GB2312
的常用表示方法 【传送门】,这里可能有人疑惑,我们上述检测的是GBK
与 UTF-8
的编码,那怎么输入获取的字符为GB2312
的呢,再次查阅文档,文档有如下的解释:GBK向下与G2312编码兼容【传送门】这样以来问题就得以解决了,我们输入的文字编码为GBK
的
通过上述的测试,我们发现,不管是高版本还是低版本在CLI进行中文输入,得到的文字编码是属于GBK
的,但是在PHP较高版本中,系统的编码变更为了65001
也就是变更为了UTF-8
的编码集,所以就导致了输入时为中文,高版本输出时变为了乱码。
在上面也说了,PHP也出了一个扩展函数:sapi_windows_cp_set
,官方给的说明是:Set the codepage of the current process.
所以我们在做PHPCLI的输入输出时,可以做一下兼容,防止输入输出中文乱码的问题:
if(PHP_VERSION > 7) sapi_windows_cp_set(936); ## 设置当前页面的字符集为GBK $a = fgets(STDIN); var_dump($a);
到此,困扰了好久的问题也得以解决,以此记录一下,相关的参考借鉴都以设置相对应链接,可以进入查看。
在此再次吐槽一次,百度,谷歌,大量的文章复制过来粘贴过去,真的很扰乱人们的视线,各种,不知道那些人有没有去做相对应的实践,拿来就发,真的被恶心到不止一次,有用的搜索不到,没用遍地都是….