JQuery Base64编码特殊字符导致FPDF输出乱码问题求助
解决瑞典特殊字符(å/ä/ö)在base64编码解码后的乱码问题
看起来你遇到的核心问题是字符编码不一致导致的乱码,尤其是在前端编码、AJAX传输、后端解码这三个环节中,UTF-8的处理没有贯穿始终。我来一步步帮你解决:
1. 前端AJAX提交的问题:避免手动拼接数据字符串
你现在直接把所有参数拼接成字符串的方式,很容易因为特殊字符的自动转义导致编码混乱。jQuery的AJAX支持直接传入对象形式的data,它会自动帮你处理UTF-8编码,避免手动拼接的错误:
// 替换原来的data拼接逻辑 $.ajax({ url: frontend_ajax_object.ajaxurl, type: "POST", contentType: "application/x-www-form-urlencoded; charset=UTF-8", data: { action: 'wpgv_doajax_pdf_save_func', nonce: nonce, template: templates_id, 'for': forName, // 注意for是JS关键字,加引号避免语法问题 from: fromName, value: voucherValue, message: message, expiry: expiry, code: code, firstname: firstName, lastname: lastName, email: email, address: address, pincode: pincode, paymentmethod: paymentMethod }, success: function(a) { window.location.replace(a); }, error: function() { alert('Error occured'); } });
同时,确认你的base64编码插件支持UTF-8。如果用的是jquery.base64.js,需要在编码时明确指定UTF-8:
fromName = $.base64.encode($('#voucherName').val(), 'utf8');
2. 后端PHP解码的优化:确保UTF-8贯穿处理
后端的sanitize_text_field函数可能会对UTF-8特殊字符造成破坏,而且要先确保POST数据本身是UTF-8编码的。修改你的解码逻辑:
// 先获取并验证POST数据的编码,确保是UTF-8(适配服务器默认编码非UTF-8的情况) $encoded_from = $_POST['from'] ?? ''; if (!mb_check_encoding($encoded_from, 'UTF-8')) { $encoded_from = mb_convert_encoding($encoded_from, 'UTF-8', 'ISO-8859-1'); } // 先解码,再做安全处理(用wp_strip_all_tags替代sanitize_text_field,更兼容UTF-8) $from = base64_decode($encoded_from); $from = wp_strip_all_tags($from);
3. 关键收尾:FPDF输出PDF时的字体支持
即使前面的编码解码都正确了,如果FPDF没有使用支持UTF-8的字体,瑞典特殊字符还是会显示乱码。你需要给FPDF配置支持Unicode的字体:
- 可以使用FPDF的
utf8扩展(针对旧版FPDF),或者直接加载如Arial Unicode MS这类支持Unicode的字体:
// 在FPDF初始化后添加字体配置 $pdf->AddFont('ArialUnicodeMS', '', 'ArialUnicodeMS.php'); $pdf->SetFont('ArialUnicodeMS', '', 12);
这样处理后,Björn这类含特殊字符的姓名就能在PDF中正确显示了。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

