PHP CLI输入中文输出乱码的解析及解决方案

关于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-CNGB2312 的常用表示方法 【传送门】,这里可能有人疑惑,我们上述检测的是GBKUTF-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);

到此,困扰了好久的问题也得以解决,以此记录一下,相关的参考借鉴都以设置相对应链接,可以进入查看。

在此再次吐槽一次,百度,谷歌,大量的文章复制过来粘贴过去,真的很扰乱人们的视线,各种,不知道那些人有没有去做相对应的实践,拿来就发,真的被恶心到不止一次,有用的搜索不到,没用遍地都是….

本博客所有文章如无特别注明均为原创。作者:止语复制或转载请以超链接形式注明转自 止语
原文地址《PHP CLI输入中文输出乱码的解析及解决方案

相关推荐

网友评论(2)

sapi_windows_cp_set(936)   话说,打印错误,又是中文乱码,
ijun 2年前 (2023-01-11) 回复
@ijun:具体要看下你当前使用的PHP版本~
止语 2年前 (2023-01-13) 回复