0

我和许多其他 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");

我还将 Content-Type 元标记设置为 utf-8

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

到目前为止,一切都按预期工作,我没有输出有趣的字符,一切进展顺利,但是在处理这些数据时我是否应该更改/考虑其他任何事情?

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

提前致谢!

4

2 回答 2

4

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

即使mb_detect_encoding()尽力这样做,您也不应该使用它来自动处理数据。因为不可能从数据本身检测编码,所以这个函数也不能。

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

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

因此,您无法从原始数据中检测到编码是理所当然的。

相反,寻找指定编码的元信息。如果没有给出编码信息,请在规范文档中查找用于数据传输的默认编码。

如果您存储来自 RSS 提要的数据,请在响应标头和/或 XML 序言中查找信息。它通常包含文档的 ISO 表示法中的编码。

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

于 2011-06-13T22:50:39.603 回答
0

最后,外部应用程序需要一个 BOM 才能正确读取文件。

于 2011-06-29T19:39:06.397 回答