通过PHP编写UTF-8文件时卡住';s fwrite


Stuck writing UTF-8 file via PHP's 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文件修复了它。浪费了几个小时。。。不过,至少我学到了一些东西。

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

我想它是以UTF-8 的形式从数据库中出来的

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

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

然而,由于某种原因,MySQL UTF8实际上并不是UTF8,因为它以3位而不是4位存储数据,因此无法存储整个UTF-8字符集,请参阅UTF-8。

因此,您需要遍历MySQL上的每一个表和列,并将其从UTF8_更改为UTF8mb4_(注意:由于MySQL 5.5.3),即UTF8_multibate_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"。字符检测非常随意,程序很难正确执行,因此通常建议不要尝试计算/猜测编码它的字符是什么,你需要知道它是什么,并告诉函数它是什么。

院长的评论实际上非常重要。HTML应该在<head>中有一个<meta charset="UTF-8">

iconv调用实际上是没有用的,如果您正确地将内容获取为UTF-8,那么就没有必要这样做。

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

祝你好运!