经过几个小时的搜索,我找不到以强制UTF-8编码保存文件的解决方案。如果字符串中只有UTF-8可用的字符,则该文件成功保存为UTF-8,但如果有ASCII和UTF-8可用的字符,则该文件保存为ASCII
file_put_contents("test1.xml", "test"); // Saved as ASCII
file_put_contents("test2.xml", "test&"); // Saved as ASCII
file_put_contents("test3.xml", "tëst&"); // Saved as UTF-8
我可以添加BOM来强制使用UTF-8文件,但文档的接收者不接受BOM:
file_put_contents("utf8-force.xml", "\xEF\xBB\xBFtest&"); // Stored as UTF-8 because of the BOM
我用一个简单的代码检查了编码:
exec('file -I '.$file, $output);
print_r($output);
由于字符&是ASCII中的单个字节,而双字节字符是UTF-8,因此文件的接收者无法读取文件。有没有一个解决方案强制文件到UTF-8没有PHP的BOM?
file_put_contents不会转换编码您必须使用mb_convert_encoding显式转换字符串
试试这个 :
$data = 'test';
$data = mb_convert_encoding($data, 'UTF-8', 'OLD-ENCODING');
file_put_contents("test1.xml", $data);
或者您可以尝试使用stream_filer
$data = 'test';
$file = fopen('test.xml', 'r');
stream_filter_append($file, 'convert.iconv.UTF-8/OLD-ENCODING');
stream_copy_to_stream($file, fopen($data, 'w'));