hdxzd12 发表于 2024-7-13 12:38

PHP返回结果无法正常显示中文

本帖最后由 20230713G001133 于 2024-7-13 15:32 编辑

现在有一个叫做(execute_command.php)的文件
<?php
header('Content-Type: text/html; charset=utf-8');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $command = $_POST['command'];
    $output = shell_exec($command);
    $output = htmlspecialchars($output, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); // 转义特殊字符并保持 UTF-8 编码
    $output = nl2br($output); // 保持换行格式
    echo $output;
} else {
    echo "Error: Method not allowed";
}
?>

通过一个HTML发送Post请求(代码如下)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>执行命令示例</title>
<style>
#output {
    font-family: SimSun, '宋体', Arial, sans-serif; /* 设置字体为宋体,如果系统不支持宋体,则使用Arial或sans-serif作为备选字体 */
}
</style>
</head>
<body>
<button id="lsCommand">查看目录列表</button>
<button id="ipconfigCommand">查看IP配置</button>
<button id="hostnameCommand">查看主机名</button>
<button id="shutdown">关闭服务器</button>
<button id="restart">重启服务器</button>
<button id="tasklist">进程列表</button>
<div id="output"></div>
<style>
#output {
    font-family: SimSun, '宋体', Arial, sans-serif; /* 设置字体为宋体,如果系统不支持宋体,则使用Arial或sans-serif作为备选字体 */
    white-space: pre; /* 保留换行符和空格 */
    overflow-x: auto; /* 显示水平滚动条 */
    max-width: 100%; /* 限制最大宽度,防止内容过宽 */
    padding: 10px; /* 添加一些内边距,使内容与边框有一定间距 */
    border: 1px solid #ccc; /* 添加边框 */
}
</style>

<script>
// 点击按钮执行命令的函数
function executeCommand(command) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'execute_command.php', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    xhr.onload = function() {
      if (xhr.status === 200) {
            document.getElementById('output').innerHTML = xhr.responseText;
      } else {
            document.getElementById('output').innerHTML = 'Error: ' + xhr.status;
      }
    };
    xhr.send('command=' + encodeURIComponent(command));
}

// 给每个按钮添加点击事件处理
document.getElementById('lsCommand').addEventListener('click', function() {
    executeCommand('dir'); // Windows下查看目录列表的命令是 dir
});

document.getElementById('ipconfigCommand').addEventListener('click', function() {
    executeCommand('ipconfig'); // Windows下查看IP配置的命令是 ipconfig
});

document.getElementById('hostnameCommand').addEventListener('click', function() {
    executeCommand('hostname'); // Windows下查看主机名的命令是 hostname
});

document.getElementById('shutdown').addEventListener('click', function() {
    executeCommand('shutdown /s /t 0');
});

document.getElementById('restart').addEventListener('click', function() {
    executeCommand('shutdown /r /t 0');
});
document.getElementById('tasklist').addEventListener('click', function() {
    executeCommand('tasklist');
});

</script>

</body>
</html>

返回结果中文部分无法正常显示
这种情况可能是什么原因造成的
应该怎么解决

yuqic987 发表于 2024-7-13 15:14

修改execute_command.php

<?php
header('Content-Type: text/html; charset=utf-8');

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    setlocale(LC_ALL, 'zh_CN.UTF-8');
    putenv('LANG=zh_CN.UTF-8');

    $command = $_POST['command'];
    $output = shell_exec($command);

    // 使用 iconv 转换编码
    $output = iconv('GBK', 'UTF-8//IGNORE', $output);

    $output = htmlspecialchars($output, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
    $output = nl2br($output);
    echo $output;
} else {
    echo "错误:方法不允许";
}
?>

VanYun 发表于 2024-7-13 12:53

    // 将 GBK 编码转换为 UTF-8 编码
    $output = mb_convert_encoding($output, 'UTF-8', 'GBK');

    // 转义特殊字符并保持 UTF-8 编码
    $output = htmlspecialchars($output, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');

快乐小风 发表于 2024-7-13 13:03

编码转U8

hdxzd12 发表于 2024-7-13 13:27

VanYun 发表于 2024-7-13 12:53
    // 将 GBK 编码转换为 UTF-8 编码
    $output = mb_convert_encoding($output ...

3如果这样修改输出就会变成这样

1045837055lucy 发表于 2024-7-13 14:06

看看数据库的编码格式

hdxzd12 发表于 2024-7-13 14:44

1045837055lucy 发表于 2024-7-13 14:06
看看数据库的编码格式

这个不需要数据库的

366697846 发表于 2024-7-13 16:29

StockGeek 发表于 2024-7-13 19:11

很明显就是编码问题,转换一下~您用360浏览器切换编码看看是否正常,如果正常。确定编码问题,就是您编码转换时候有问题

qery7icgq 发表于 2024-7-13 21:00

浏览器编码问题?
页: [1]
查看完整版本: PHP返回结果无法正常显示中文