PHP file_put_contents and UTF-8


PHP file_put_contents and UTF-8

我有读取远程文件内容并将其写入本地服务器的脚本。文件包含字符: ąčęėįšųūž.将数据插入本地文件后,UTF-8 编码将丢失。我的脚本代码:

<?php 
$data = file_get_contents('remote_file_address');
echo $data; //encoding is ok
$file = dirname(__FILE__) . '/../downloads/data.csv';
file_put_contents($file,$data); //invalid encoding in data.csv file
?>

我也按照这篇文章的说明进行操作(如何以 UTF-8 格式编写文件?),但仍然不好。

那么这有什么问题呢?有什么想法吗?

问题是使用 windows-1257 编码的远程文件。我在这里找到了解决方案。

所以正确的代码应该如下所示:

<?php 
$data = file_get_contents('remote_file_address');
$data = iconv("CP1257","UTF-8", $data);
$file = dirname(__FILE__) . '/../downloads/data.csv';
file_put_contents($file,$data);
?>

PHP 不知道编码。PHP 中的字符串只是存储原始字节的字节数组。当从某处读取字符串时,文本以原始字节读取并以原始字节存储。写入文件时,PHP 将原始字节写入文件。PHP 在任何时候都不会自行转换编码。您在任何时候都不需要做任何特别的事情,您需要做的就是不要自己弄乱编码。如果编码一开始是 UTF-8,那么如果您不触摸它,它仍然是 UTF-8。

如果在其他程序中打开最终文件时编码很奇怪,则很可能是其他程序误解了编码。文件很好,只是没有正确显示。

确保您的脚本和远程文件以 UTF-8 编码,并确保用于读取数据的软软件.csv以 UTF-8 读取数据。我个人使用记事本++来检查这一点。如果你所有的东西都是UTF-8,你不需要任何*utf8_(en|de)代码函数。如果您的远程文件未以 UTF-8 编码,则必须使用它们