utf 8 - 使用 PHP 检测、保存、输出 UTF8


utf 8 - Detecting, Saving, Outputting UTF8 with PHP

像许多其他PHP开发人员一样,我在字符编码方面遇到了问题,这个问题将概述我为确保我的数据保存并输出为UTF8而经历的步骤。我想要任何关于我应该考虑和/或改变我目前的想法的建议。

我有一个 mysql 数据库DEFAULT CHARACTER UTF-8我的表有utf8_general_ci的排序规则

我正在使用 php 脚本从 RSS 提要中读取数据,然后将该数据保存到数据库中。在保存该数据之前,我通过执行以下操作来检查该数据是否为 UTF-8:

protected function _convertToUTF8($content) {
    $enc = mb_detect_encoding($content);
    return mb_convert_encoding($content, "UTF-8", $enc);
}

将此数据输出到网页时,我用 php 设置了标题

header("Content-type: text/html; charset=utf-8");

并且我还将内容类型元标记设置为 utf-8

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

到目前为止,一切都

按预期工作,我没有输出有趣的角色,一切都很顺利,但是在处理这些数据时我应该更改/考虑其他任何事情吗?

我现在遇到的问题是将此数据输出到 txt 文件 (csv( 我正在使用已成功创建文件的 fwrite((,但我将此文件传递给的第三方说该文件不是 UTF-8。我不确定数据是否以 UTF-8 格式输出,如何检查?当通过 SSH 登录到远程服务器并且我 cat 文件时,当我 vim 文件时我得到Itâs a Itâ~@~Ys我得到的文件It<E2><80><99>s我在这里错过了什么?

提前感谢!

您无法检测到任何数据的编码。编码始终是数据本身旁边的元信息。

即使尝试最好这样做mb_detect_encoding(),也不应该使用它来自动处理数据。因为由于无法从数据本身检测编码,因此此功能也不能。

不要依赖它。仅在需要调试问题或最后的回退手段时将其用于手动检查,但切勿用于标准数据处理。即使这样,也不要太相信这些信息。

我怎么能这么说呢?举个例子:文本可以有效地进行 US-ASCII 编码,UTF-8 的检测例程将返回它是有效的 UTF-8 编码。这只是一个例子。事实是,这要复杂得多。

因此,您可以理所当然地认为您无法从原始数据中检测到编码。

相反,请查找指定编码的元信息。如果未提供编码信息,请在规范文档中查找默认编码以进行数据传输。

对于从 RSS 源存储数据,请在响应标头和/或 XML 序言中查找信息。它通常包含文档的ISO表示法的编码。

由于数据库需要编码为 UTF-8 的数据,因此处理过程中必须注意仅将 UTF-8 数据放入数据库。因此,请检查并获取数据的编码,然后执行更改编码所需的步骤。但不要依赖mb_detect_encoding()来执行这些步骤。

最后,

它是外部应用程序正确读取文件所需的 BOM。