You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:27:17