FPDF输出含瑞典语特殊字符的姓名时变量值为空问题求助
嘿,我来帮你拆解下这个问题——你遇到的核心问题其实是**sanitize_text_field()函数破坏了UTF-8编码的特殊字符**,导致后续iconv转换失败,最终PDF输出为空。
为什么会这样?
sanitize_text_field()是WordPress的内置函数,它本来是用来处理ASCII文本的,内部用单字节操作来过滤字符(比如移除非打印字符、转义HTML标签)。但瑞典语的å、ä、ö都是UTF-8多字节字符,经过这个函数处理后,会被拆成无效的字节序列,导致$name不再是有效的UTF-8字符串。
你直接给iconv传硬编码的'Björn'时,字符串是完整有效的UTF-8,所以转换正常;但经过sanitize_text_field()处理后的变量已经损坏了,iconv遇到无效UTF-8时默认会返回空字符串(或者false),这就是PDF输出为空的原因。至于你尝试的utf8_encode(),因为$name已经不是有效的UTF-8了,所以根本起不到作用,反而可能让问题更糟。
具体解决步骤
1. 换掉sanitize_text_field(),用UTF-8友好的过滤方式
别再用sanitize_text_field()处理带多字节字符的输入了,试试下面两种方案:
- 用
wp_kses()只保留你需要的字符(这里我们只留字母、空格和瑞典语特殊字符):$name = base64_decode($_POST['name']); // 不允许任何HTML标签,只保留合法字符 $allowed = array(); $name = wp_kses($name, $allowed); - 手动正则过滤(适合简单场景):
$name = base64_decode($_POST['name']); // 只保留字母、空格和åäöÅÄÖ,u修饰符确保多字节匹配 $name = preg_replace('/[^a-zA-ZåäöÅÄÖ\s]/u', '', $name);
2. 加一层UTF-8有效性检查,避免转换失败
在转码前先确认字符串是有效的UTF-8,同时给iconv加错误处理参数,就算有无效字符也不会返回空:
$name = base64_decode($_POST['name']); // 上面的过滤逻辑... // 检查并修复无效的UTF-8序列 if (!mb_check_encoding($name, 'UTF-8')) { $name = mb_convert_encoding($name, 'UTF-8', 'UTF-8'); } // 用//IGNORE忽略无法转换的字符,防止返回空 $specialCharacterName = iconv('UTF-8', 'windows-1252//IGNORE', $name);
3. 确认前端的base64编码是否正确
还要确保前端在把姓名转成base64时,是基于UTF-8编码的。比如JavaScript里应该这么写:
const name = 'Björn'; // 正确的UTF-8转base64方式 const base64Name = btoa(unescape(encodeURIComponent(name)));
如果前端编码错了,解码后的$name本来就是乱码或无效UTF-8,后续处理自然也会出问题。
额外小建议
FPDF原生对UTF-8支持不太好,如果你不想折腾转码的事,可以试试tFPDF——它是FPDF的扩展,能直接输出UTF-8字符,省掉很多编码麻烦。
内容的提问来源于stack exchange,提问作者Alex

