PHP exec调用Java程序时中点字符显示为问号的问题排查
解决PHP exec调用Java程序时特殊字符显示为问号的问题
从你的描述和十六进制输出来看,问题的核心是Java程序的输出编码与PHP/Web环境的UTF-8编码不匹配,导致原本的·(UTF-8编码为C2B7)被转换成了问号?(ASCII编码3F)。下面是具体的解决步骤:
1. 强制Java程序以UTF-8输出
Java默认会使用系统的默认字符编码(比如很多Linux服务器默认是ISO-8859-1或POSIX),这会导致它输出的·不是UTF-8格式。你可以在启动Java时添加-Dfile.encoding=UTF-8参数,强制标准输出使用UTF-8:
exec("/usr/bin/java -Dfile.encoding=UTF-8 -jar runner.jar ".escapeshellarg($_POST['texte']), $variable);
这里顺便加了escapeshellarg(),既可以避免命令注入风险,也能确保传入的UTF-8参数被Java正确读取。
2. 确保PHP环境的编码设置为UTF-8
在PHP代码开头添加以下代码,明确设置内部编码和输出编码为UTF-8:
mb_internal_encoding('UTF-8'); mb_http_output('UTF-8');
如果有权限,也可以修改php.ini文件,设置default_charset = "UTF-8",这样全局生效。
3. 检测并转换输出编码(可选)
如果上面的步骤还没解决,可以先检测Java输出的编码,再手动转成UTF-8:
$raw_output = $variable[0]; $detected_encoding = mb_detect_encoding($raw_output, ['ISO-8859-1', 'UTF-8']); if ($detected_encoding !== 'UTF-8') { $fixed_output = mb_convert_encoding($raw_output, 'UTF-8', $detected_encoding); echo "<br>output text : ".$fixed_output; } else { echo "<br>output text : ".$raw_output; }
验证方法
修改后,你可以查看输出的十六进制码,如果·对应的是C2B7,说明编码已经正确,在UTF-8的HTML页面就能正常显示了。
内容的提问来源于stack exchange,提问作者Mehdi_debout
相关产品推荐
相关产品推荐

