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

标签 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 文件修复了它。浪费了几个小时……不过至少我学到了一些东西。

最佳答案

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

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 在这里毫无值(value),从“utf-8”变成了呃,“utf-8”。字符检测非常随意,程序很难正确执行,因此通常建议不要尝试计算/猜测编码它的字符是什么,您需要知道它是什么并告诉函数它是什么。

关于php - 坚持通过 PHP 的 fwrite 编写 UTF-8 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33815108/

相关文章:

sockets - 如何检测字符串以UTF-8序列的中间结尾?

drupal - 使用忽略某些 unicode 字符的 PDFTK(或 php/javabridge)填写 PDF 表单

c - fwrite() 如果任何单个字节的符号位为 1,则将全 1 写入更高有效位(写入 int)

php - 错误: You have an error in your SQL syntax; near ')' at line 1

php - MySQL 多表关系

java - XmlBeans 生成具有 ANSI 编码的 Java 源文件

php - 在 PHP 中向文件写入新行(换行)

c++ - 如何用cpp中的 map 内容覆盖文件

php - 帮助 PHP 的 Bootstrap 和正则表达式

php - 为什么主键值上的 is_int 返回字符串?