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
相关产品推荐
相关产品推荐

