使用PHP检测,保存,输出UTF8

时间:2011-06-13 22:28:54

标签: php utf-8 character-encoding fwrite multibyte-functions

我和许多其他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()已经成功创建了该文件但是我传递此文件的第三方说该文件不是UTF- 8。 我不确定数据是以UTF-8 输出的,我该怎么检查?当通过SSH登录到远程服务器并且我收到文件时,我收到文件时Itâs a,当我减去文件时,我得到Itâ~@~Ys It<E2><80><99>s我在这里缺少什么?

提前致谢!

2 个答案:

答案 0 :(得分:4)

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

即使mb_detect_encoding()尝试最好这样做,也不应该使用它来自动处理数据。因为不可能从数据本身检测编码,所以这个功能也不行。

不要依赖它。仅用于手动检查,以防您需要调试问题或在最后的回退中使用,但绝不会在标准数据处理中使用。即便如此,也不要太信任这些信息。

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

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

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

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

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

答案 1 :(得分:0)

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