PHP:json_encode写入文件时如何显示变音符号而非转义码?
解决JSON写入文件时变音符号被转义的问题
你遇到的核心问题是json_encode默认会转义UTF-8编码的特殊字符(比如德语变音符号ä、ü这些),导致写入文件后显示成转义形式,而不是正常的字符。之前用utf8_encode没效果,大概率是因为你的字符串本身已经是UTF-8编码了,再转一次反而起反作用。
下面是具体的解决步骤和代码示例:
关键解决方案:修改json_encode的参数
PHP的json_encode函数有个专门的常量JSON_UNESCAPED_UNICODE,作用就是让UTF-8字符保持原样,不被转义。把它作为第二个参数传入即可:
// 假设$post是你要写入的内容 fwrite($fp, json_encode($post, JSON_UNESCAPED_UNICODE));
如果需要让生成的JSON更易读(格式化输出),还可以搭配JSON_PRETTY_PRINT常量,用管道符|组合多个参数:
fwrite($fp, json_encode($post, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
为什么utf8_encode没用?
utf8_encode的作用是把ISO-8859-1(Latin-1)编码的字符串转换成UTF-8。如果你的原字符串已经是UTF-8编码(比如从API拿到的JSON本身就是UTF-8的),再用这个函数会把字符串转成乱码或者无效编码,自然解决不了转义问题。
你可以先检测一下字符串的编码,确认是不是UTF-8:
$string = "Außenministerium verhängte Reisewarnung für Kroatien in Kraft getreten."; echo mb_detect_encoding($string); // 输出UTF-8就说明不需要转码
完整示例代码
// 假设从API获取到的内容已经是UTF-8编码的字符串 $apiResponse = '{"content":"Außenministerium verhängte Reisewarnung für Kroatien in Kraft getreten."}'; $post = json_decode($apiResponse, true); // 打开文件(注意用"w"模式时要确保文件权限正确) $fp = fopen('output.json', 'w'); if ($fp) { // 用JSON_UNESCAPED_UNICODE参数写入 fwrite($fp, json_encode($post, JSON_UNESCAPED_UNICODE)); fclose($fp); }
这样写入文件后,里面的变音符号就会正常显示成Außenministerium,而不是转义后的形式啦。
内容的提问来源于stack exchange,提问作者Osvald Laurits
相关产品推荐
相关产品推荐

