You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP编码转换API无效?如何将UTF-8波斯文正常写入文件?

问题:PHP写入波斯文JSON时出现Unicode转义,编码转换API无效

以下是我编写的PHP代码:

<?php

$filename = "";
if ($handle = opendir("test")) {
    while (false !== ($file = readdir($handle))) {
        
        $filename = $file;
    }
    closedir($handle);
}

$arr = array(
    "name" => "اصغر",
    "family"=>"فرهادی",
    "Movies" => [
        "City" => "[جدایی نادر از سیمین]",
        "detail" => [
            "yearOf" => "2011",
            "language" => "persian"
        ]
    ]
);


$json =  json_encode($arr);
$encoding = mb_detect_encoding($json);
echo $encoding."
";

$json1 = mb_convert_encoding($json, "UTF-8");

$encoding2 = mb_detect_encoding($json1);

echo $encoding2."
";

$h = fopen("out.txt","a+");
fwrite($h, $json1."
");
fclose($h);

执行php index.php命令后,控制台输出ASCII ASCII,生成的out.txt文件内容是Unicode转义字符形式的JSON,而非波斯文原文。尝试过iconv函数,结果依旧如此,请问为何编码转换API无法生效?


解答

核心问题出在json_encode的默认行为上,和编码转换函数无关:

  • json_encode默认会将所有非ASCII字符转换为\uXXXX格式的Unicode转义序列,转义后的内容全部属于ASCII字符范围,所以mb_detect_encoding检测结果是ASCII。
  • 此时调用mb_convert_encoding或iconv将ASCII转成UTF-8,本质上不会改变内容——因为ASCII是UTF-8的子集,转换后还是原来的转义字符,自然看不到波斯文原文。

解决方法

在json_encode时添加JSON_UNESCAPED_UNICODE参数,让函数直接输出UTF-8编码的非ASCII字符,不进行转义:

修改后的关键代码:

$json = json_encode($arr, JSON_UNESCAPED_UNICODE);
// 后续不需要再做编码转换,直接写入文件即可
$h = fopen("out.txt","a+");
fwrite($h, $json."\n");
fclose($h);

补充说明

  • 添加参数后,json_encode生成的JSON会直接保留波斯文的UTF-8编码字符,此时mb_detect_encoding检测结果会是UTF-8。
  • 原代码中opendir遍历目录的部分没有实际作用,可以根据需求删除。

内容的提问来源于stack exchange,提问作者Navid_pdp11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:05:09