PHP / 输出文件编码 / 从 ANSI 更改为 UTF-8-BOM

PHP / Output file Encoding / Changing from ANSI to UTF-8-BOM

提问人:EarthLing 提问时间:9/11/2023 最后编辑:EarthLing 更新时间:9/11/2023 访问量:102

问:

有没有办法防止PHP自动更改Excel文件或设置编码的编码?

已经尝试过:

ini_set('default_charset', 'ANSI');
ini_set('output_encoding', 'ANSI');
header('Content-Type: application/vnd.ms-excel; charset=ANSI');

使用“phpoffice/phpexcel”。如果我在服务器上保存构建的 Excel 文件,并在没有 PHP 的情况下下载保存的文件,那么在 NotePad++ 中对该文件的编码是 ANSI,并且文件在 MS Excel 程序中正确打开。

但是,如果我尝试通过PHP返回正确的文件:

readfile($file_path);
// OR directly write to output
$objWriter->save('php://output');

然后下载的 Excel 文件编码将是 UTF-8-BOM,结束 MS Excel 只显示该文件的奇怪符号。但是我可以在NotePad ++中打开该文件并将编码更改为ANSI,然后该文件在MS Excel中正确打开。

如何使用PHP将Excel文件返回到客户端,而无需自动更改该文件的编码?

PHP 文件 编码 UTF-8 字节顺序标记

评论

0赞 CBroe 9/11/2023
您确定您的 PHP 脚本本身没有使用 BOM 保存吗?
0赞 EarthLing 9/11/2023
@CBroe,您询问读取并返回 Excel 文件的 PHP 脚本?那个只是 UTF-8。
0赞 CBroe 9/11/2023
是的,这就是我的意思。确定它是没有 BOM 的 UTF-8?因为如果它有一个,那很可能是你的脚本发送到客户端的第一个“输出”。
0赞 EarthLing 9/11/2023
@CBroe,没有“是”:本地 NotePad++ 只显示“UTF-8”shell head -c3 "show_xls.php" | grep -q $'\xef\xbb\xbf' && echo yes
0赞 CBroe 9/11/2023
而你直接调用该脚本,它不会包含在其他内容中?如果您能够调用那里,那么它必须嵌入其他文件,我想 - 也许是来自其中一个的 BOM?$objWriter->save

答:

0赞 EarthLing 9/11/2023 #1

由于使用 PHP @CBroe和检测 UTF BOM(字节顺序标记),在设置“附件”标头之前:

$has_bomed_files = false;
foreach (get_included_files() as $file_path)
{
    $str = file_get_contents($file_path);
    $bom = pack("CCC", 0xef, 0xbb, 0xbf);
    if (0 === strncmp($str, $bom, 3))
    {
        $has_bomed_files = true;
        print $file_path;
        print '<br>';
    }
}

if ($has_bomed_files)
    exit(__FILE__ . ":" . __LINE__);

发现,BOM 在一个类中,我已经删除了该 BOM,现在 PHP 返回正确的 Excel 文件。