升级到PHP 8后shell无法输入非ASCII字符的问题求助
问题根因
该问题是PHP 8.0及以上版本CLI模式下的GNU readline扩展默认配置变更导致的。PHP 8调整了readline扩展的字符输入校验逻辑,默认关闭了非ASCII字符的输入支持,仅在显式开启input_meta配置时才会允许多字节字符输入。Mac环境下默认编译的PHP使用libedit替代GNU readline,不受该配置影响,因此功能正常。
修复步骤
- 第一步:校验系统locale配置
运行命令locale查看当前系统编码配置,确认所有LC_*开头的配置项值均为UTF-8格式(如ru_RU.UTF-8、zh_CN.UTF-8)。如果配置错误,运行sudo dpkg-reconfigure locales,选中你需要的UTF-8区域语言并设置为系统默认,重启终端后生效。 - 第二步:修改PHP CLI的readline配置
进入PHP 8 CLI的配置目录/etc/php/8.x/cli/conf.d/(将路径中的8.x替换为你实际安装的PHP8版本号,例如8.1、8.2),新建自定义配置文件99-readline.ini,写入如下内容:readline.input_meta = On
保存后运行php -m | grep readline,确认readline扩展处于启用状态。 - 第三步:适配PsySH配置(如果使用PsySH)
在用户目录下创建PsySH配置文件~/.config/psysh/config.php,写入如下内容:<?php return [ 'readline' => [ 'input_meta' => true ] ];
验证方案
执行php -a启动PHP交互式shell,输入俄语、中文等非ASCII字符,确认可以正常显示输入即可。
内容的提问来源于stack exchange,提问作者Capybarro
相关产品推荐
相关产品推荐

