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
相关产品推荐
相关产品推荐

