fwrite php utf8,坚持通过PHP的fwrite编写UTF-8文件

本文探讨了在PHP中处理从UTF-8数据库获取内容并写入文件时遇到的问题,重点在于MySQL字符集设置和iconv函数的正确使用。作者发现数据库编码并非问题,而是Apache的字符集配置导致,通过修改.htaccess添加AddDefaultCharset utf-8解决了问题。
摘要由CSDN通过智能技术生成

我无法弄清楚我做错了什么.我从数据库中获取文件内容.当我回复内容时,一切都显示得很好,当我将它写入文件(.html)时,它会中断.我已经尝试过iconv和其他一些解决方案,但是我只是不明白我应该为第一个参数添加什么,我尝试过空白,但这也没有用.我认为它是以UTF-8的形式出来的,如果它正确回应的话.卡住了一会儿,没有太多运气.

function file($fileName, $content) {

if (!file_exists("out/".$fileName)) {

$file_handle = fopen(DOCROOT . "out/".$fileName, "wb") or die("can't open file");

fwrite($file_handle, iconv('UTF-8', 'UTF-8', $content));

fclose($file_handle);

return TRUE;

} else {

return FALSE;

}

}

html文件的来源看起来像.

像这样出来的DB:

Текущая стабильная версия CMS

像这样进入文件

Ð¢ÐµÐºÑƒÑ‰Ð°Ñ ÑÑ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ CMS

编辑:

原来问题的根源是Apache不正确地提供文件.添加

AddDefaultCharset utf-8

到我的.htaccess文件修复它.浪费时间……至少我学到了一些东西.

解决方法:

编辑:数据库编码似乎不是这里的问题,因此这部分答案仅保留供参考

I assume it’s coming out of the DB as UTF-8

这很可能是您的问题,您使用的数据库类型是什么?您是否设置了数据库,表,连接和传输的字符编码和排序规则详细信息.

如果我冒险猜测,我会说你的表是MySQL,你的数据库/表/列的MySQL排序规则应该都是UTF8_general_ci?

但是,出于某种原因,MySQL UTF8实际上不是UTF8,因为它将数据存储在3位而不是4位,因此无法存储整个UTF-8字符集,请参阅UTF-8 all the way through.

因此,您需要浏览MySQL上的每个表格列,并将其从UTF8_更改为UTF8mb4_(注意:自MySQL 5.5.3起),它是UTF8_multibyte_4,涵盖整个UTF-8字符谱.

此外,如果您对数据字符串执行任何PHP工作,请注意您应该使用mb_ PHP函数进行多字节编码.

最后,您需要为数据库指定连接字符集,不要使用默认值运行,因为它几乎肯定不是UTF8mb4,因此您可以在数据库中拥有正确的数据,但随后重新打包该数据作为3位UTF8之前被另一端用PHP视为4位UTF8.

希望这会有所帮助,如果您的数据库不是MySQL,请告诉我们它是什么!

编辑:

function file($fileName, $content) {

if (!file_exists("out/".$fileName)) {

$file_handle = fopen(DOCROOT . "out/".$fileName, "wb") or die("can't open file");

fwrite($file_handle, iconv('UTF-8', 'UTF-8', $content));

fclose($file_handle);

return TRUE;

} else {

return FALSE;

}

}

>你的$file_handle正在尝试在if语句中打开一个文件,该文件只有在文件不存在时才会运行.

>你的iconv在这里毫无价值,从“utf-8”变为呃“utf-8”.字符检测非常偶然,并且程序难以正确执行,因此通常建议不要尝试计算/猜测编码它的字符,你需要知道它是什么并告诉函数它是什么.

标签:php,utf-8,fwrite

来源: https://codeday.me/bug/20190706/1397931.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值