php file_put_contents 编码,PHP file_put_contents和UTF-8

我有读取远程文件内容并将其写入本地服务器的脚本。 文件包含字符:???????ū?。 将数据插入本地文件后,UTF-8编码将丢失。

我的脚本代码:

$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格式写入文件?),但仍然没有效果。

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

在php.net上有很多关于此的评论。 php.net/manual/de/function.file-put-contents.php。您是否尝试过重新编码file_put_contents($myFile, utf8_encode($myContent));之类的数据或将BOM表设置为file_put_contents($myFile,"\xEF\xBB\xBF".$myContent);之类的?

如果无效,则在执行echo file_get_contents(dirname(__FILE__) . ..downloadsdata.csv);时应该会看到问题。是这样吗

@sofl,是的,我已经尝试了所有这些方法。

@Jack,当我回显file_get_contents时,我得到了正确的结果。但是将结果写入文件后,编码将变得无效。

@Bounce您如何确定编码错误?

@Bounce:您怎么知道编码变得无效? btw的编码是什么?

由于您是用CSV格式编写的,因此请允许我猜测您是使用Excel打开的。让我继续记录地说,Excel臭名昭著的是编码。 :)

@hakre,我知道,当我打开本地文件时。但是我想问题出在远程文件上。远程文件使用Windows-1257编码。当我尝试将编码更改为UTF-8时,所有符号,如???????ū?成为象形文字。因为我的本地文件编码正确(没有BOM的UTF-8)。

@deceze,没有我使用记事本++ :)

如果原始文件是在1257中编码的,则最终文件也是1257,因此Notepad ++需要将其打开,就好像其是1257编码文件一样。如果要转换编码并实际保存UTF-8文件,请使用iconv进行转换。

@deceze,谢谢Ive已经完成了;)

@Bounce:一个小提示:询问编码问题没有帮助,但仅在询问后才给出编码。在您的情况下,您只需要将文件数据从windows-1257重新编码为UTF-8,就可以完成了。请参阅如何更改字符串的编码?

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

因此正确的代码应如下所示:

$data = file_get_contents('remote_file_address');

$data = iconv("CP1257","UTF-8", $data);

$file = dirname(__FILE__) . '/../downloads/data.csv';

file_put_contents($file,$data);

?>

对于您不知道原始编码的情况,有一个有趣的答案-stackoverflow.com/a/7980354/1835470,快速提示:mb_detect_encoding()

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

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

确保脚本和远程文件使用UTF-8编码,并确保用于读取数据的软件。csv使用UTF-8读取它。我个人使用Notepad ++进行检查。

如果所有内容都使用UTF-8,则不需要任何* utf8_(en | de)code函数。

如果您的远程文件未使用UTF-8编码,则必须使用它们

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值