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

时间:2015-11-19 21:58:05

标签: php utf-8 fwrite

我无法弄清楚我做错了什么。我从数据库中获取文件内容。当我回复内容时,一切都显示得很好,当我将它写入文件(.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文件的来源如下。

像这样出来的数据库:

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

像这样进入文件

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

修改

原来问题的根源是Apache错误地提供文件。添加

AddDefaultCharset utf-8

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

2 个答案:

答案 0 :(得分:1)

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

  

我认为它是以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在这里毫无价值,从#34; utf-8&#34;呃,&#34; utf-8&#34;。字符检测非常杂乱,程序难以正确执行,因此一般建议不要尝试解决 / 猜测编码它的字符,你需要知道它是什么,并告诉函数它是什么。

答案 1 :(得分:0)

Dean的评论其实非常重要。 HTML应在<meta charset="UTF-8">内有<head>

iconv调用实际上没用,如果您将内容设为UTF-8是正确的,则没有必要。

您应该检查数据库连接的字符集。您的数据库可以用UTF-8编码,但连接可以是另一个字符集。

祝你好运!