PHP使用fopen/fwrite写入文件出现Unicode转义问题求助
咱们一步步排查解决,你遇到的问题大概率是写入时的编码处理、文件打开模式不对,或是后续查看文件的工具编码设置出了问题:
先确认字符串的真实编码
虽然你说打印正常,但可以先验证数组里的字符串是不是真的UTF-8编码。在代码里加一行检测:$testStr = "Délai de livraison"; // 或者直接取数组里的对应元素 echo mb_detect_encoding($testStr, 'UTF-8, ISO-8859-1', true);如果输出是
UTF-8,那字符串本身没问题;如果是ISO-8859-1,再用mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1')转码就行——不过你说打印正常,应该是UTF-8没问题。立刻停止使用
utf8_encode()!
这个函数是把ISO-8859-1编码的字符串转成UTF-8,如果你的字符串已经是UTF-8,用它反而会把正确字符转成乱码,这就是你试了没用的核心原因,直接放弃这个方法。用二进制模式打开文件写入
默认的fopen文本模式(比如'w')在不同系统下可能自动转换字符或换行,改用二进制模式'wb'能确保写入原始字节,避免编码被篡改:$fileHandle = fopen('你的目标文件.txt', 'wb'); if ($fileHandle) { // 若需要兼容旧工具(比如旧版Excel)才加UTF-8 BOM,否则建议跳过 // fwrite($fileHandle, "\xEF\xBB\xBF"); fwrite($fileHandle, implode("\n", $你的数组)); // 先把数组转成字符串再写入 fclose($fileHandle); }注意:BOM不是必须的,现代编辑器大多支持无BOM的UTF-8,加了反而可能导致读取时出现多余字符。
检查打开文件的工具编码
有时候文件本身是正确的UTF-8,但你用的打开工具(比如Windows自带记事本)默认编码不是UTF-8,就会把é显示成奇怪的转义字符。试试用Netbeans直接打开这个文件(它默认是UTF-8),或者用Notepad++选择编码 -> UTF-8查看,确认是不是工具的锅。简化操作:用
file_put_contents替代fopen/fwrite
这个函数更简洁,还能避免模式设置错误的问题,示例:$content = implode("\n", $你的数组); // 把数组转成按换行分隔的字符串 $filePath = '你的文件.txt'; // 仅当文件为空时写入BOM(可选) if (!file_exists($filePath) || filesize($filePath) === 0) { file_put_contents($filePath, "\xEF\xBB\xBF"); } file_put_contents($filePath, $content, FILE_APPEND | LOCK_EX);
最后再提一句:Netbeans默认是UTF-8编码,你的代码文件本身没问题,重点放在写入时的文件模式和编码处理上,以及后续查看文件的工具设置就好。
内容的提问来源于stack exchange,提问作者Galivan

