【问题标题】:Detecting, Saving, Outputting UTF8 with PHP使用 PHP 检测、保存、输出 UTF8
【发布时间】:2011-06-13 22:28:53
【问题描述】:

与许多其他 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 登录到远程服务器并且我 cat 文件时,我得到 Itâs a,当我 vim 文件时,我得到 Itâ~@~Ys,当我减少文件时,我得到 It<E2><80><99>s我在这里错过了什么?

提前致谢!

【问题讨论】:

  • 它抱怨的文件中可能有 BOM 吗?或者它可能需要文件中的 BOM?我知道我之前遇到过这个问题(不是在这个特定的应用程序中),我不得不在没有 BOM 的情况下重新保存一个文件(在 utf-8 中)才能让它正常工作。
  • 是的,但希望我已经解释清楚并得到一个很好的答案,这将有助于未来的人们,因为发布的问题很模糊,通常与输出有关,而不是保存数据。
  • 例如,请参阅这篇关于编辑器在没有 BOM 的情况下无法将文件正确解释为 utf-8 的帖子:stackoverflow.com/questions/2558172/…
  • 这个问题是在询问关于整个过程的观点和事实,而不是个别错误。
  • 您在我的回答中对此有一个众所周知的看法,并且对整个过程有一个非常一般的提示;)

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


【解决方案1】:

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

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

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

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

所以理所当然地无法从原始数据中检测到编码。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多