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

PHP项目升级后phpspreadsheet导出Excel德语变音字符乱码求助

德语变音字符在PhpSpreadsheet生成Excel中乱码的解决方案

问题背景

原PHP 5.2项目升级至PHP 8.2,用PhpSpreadsheet替代停止维护的PHPExcel。项目全栈(PHP、HTML、数据库连接)均为UTF-8编码,数据库连接配置含PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,php.ini默认字符集已设为UTF-8。网页上德语变音字符显示正常,但填充到Excel模板后出现乱码(如Prüfung变成prüfung),数据库排序规则为Latin1_General_CI_AS。

解决步骤

  • 强制字符串编码转换
    数据库排序规则Latin1_General_CI_AS对应编码为ISO-8859-1(Windows-1252),即便PDO配置了UTF-8编码,仍可能存在转码不彻底的情况。在写入Excel单元格前,检查并转码字符串:

    // 检查字符串编码,若为ISO-8859-1则转成UTF-8
    $value = mb_check_encoding($value, 'UTF-8') ? $value : mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1');
    $sheet->setCellValue('A1', $value);
    
  • 设置支持变音字符的字体
    部分Excel阅读器对默认字体的西欧字符支持不足,指定支持变音字符的字体(如Arial、Calibri):

    // 为单个单元格设置字体
    $styleArray = [
        'font' => [
            'name' => 'Arial',
        ]
    ];
    $sheet->getStyle('A1')->applyFromArray($styleArray);
    
    // 或为整个工作表设置默认字体
    $sheet->getDefaultStyle()->getFont()->setName('Arial');
    
  • 验证PDO连接编码有效性
    执行SQL语句确认数据库连接的编码转换是否正常:

    $stmt = $pdo->query('SELECT COLLATIONPROPERTY(\'Latin1_General_CI_AS\', \'CodePage\')');
    $codePage = $stmt->fetchColumn();
    // 若返回1252,说明数据库底层编码为Windows-1252,需确保PDO正确转码为UTF-8
    

    若PDO转码失效,手动转码是更可靠的方案。

  • 避免重复编码转换
    检查代码中是否存在多次转码逻辑(如先转UTF-8又转其他编码),重复转码会导致字符乱码。确保写入Excel的字符串是单一UTF-8编码。

内容的提问来源于stack exchange,提问作者Butch82

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:05:05