PHP创建含UTF-16(LE-BOM)十六进制值与字符串的文件
解决方案:PHP生成含UTF-16(LE)带BOM十六进制的文件
核心实现思路
- 姓名、姓氏类字符串直接保留原编码(建议统一转为UTF-8后处理,避免乱码)
- 年龄、分数先转为字符串,再编码为带BOM的UTF-16LE格式,最后转换为十六进制值
- 将所有内容按自定义格式拼接后写入目标文件
完整代码示例
<?php // 模拟从POST获取输入(实际项目需添加XSS过滤、格式校验等安全处理) $firstName = $_POST['first_name'] ?? '张三'; $lastName = $_POST['last_name'] ?? '李'; $age = $_POST['age'] ?? '25'; $score = $_POST['score'] ?? '92.5'; // 将字符串转为带BOM的UTF-16LE十六进制 function strToUtf16LeHex($str) { // UTF-16LE的BOM标识为0xFFFE $bom = "\xFF\xFE"; // 将UTF-8字符串转成UTF-16LE编码的二进制内容 $utf16leContent = mb_convert_encoding($str, 'UTF-16LE', 'UTF-8'); // 拼接BOM后转成十六进制字符串 return bin2hex($bom . $utf16leContent); } // 转换年龄和分数为目标格式 $ageHex = strToUtf16LeHex($age); $scoreHex = strToUtf16LeHex($score); // 拼接最终写入内容(格式可按需调整) $content = "姓名: {$firstName}\n"; $content .= "姓氏: {$lastName}\n"; $content .= "年龄(UTF-16LE带BOM十六进制): {$ageHex}\n"; $content .= "分数(UTF-16LE带BOM十六进制): {$scoreHex}\n"; // 写入文件,扩展名可自定义(如txt、dat等) file_put_contents('user_info.txt', $content); echo "文件生成完成!"; ?>
错误结果与期望结果对比
以输入年龄为25为例:
- 错误结果(直接转十六进制):
3235(仅为UTF-8字符串的十六进制,无BOM,非UTF-16LE编码) - 期望正确结果:
fffe32003500(包含UTF-16LE的BOMfffe,2的UTF-16LE编码为3200,5为3500)
以输入分数为92.5为例:
- 错误结果:
39322e35 - 期望结果:
fffe390032002e003500
关键细节提示
- 必须手动添加UTF-16LE的BOM(
0xFFFE),mb_convert_encoding默认不会自动生成BOM - 转换编码时需明确源编码为UTF-8,若输入字符串是其他编码(如GBK),需调整
mb_convert_encoding的第三个参数 - 使用
bin2hex()将二进制编码内容转为可读的十六进制字符串,确保写入文件后能直接查看目标格式值
内容的提问来源于stack exchange,提问作者Adam Luper
相关产品推荐
相关产品推荐

