【问题标题】:Is there any downside to save all my source code files in UTF-8?以 UTF-8 保存我的所有源代码文件有什么缺点吗?
【发布时间】:2011-04-05 13:50:27
【问题描述】:

如果相关(很有可能),它们就是 PHP 源代码文件。

【问题讨论】:

  • 有点离题 - 任何严肃的项目都应该将所有数据(包括 UI 文本)存储在某个数据库中,而不是将其硬编码在源代码文件中。如果您遵循这一点,那么只有代码 cmets 可能需要 UTF8。
  • 用于本地化。即使不需要本地化,也可能在将来。
  • @binaryLV 嗯,是的,就是这样,这些 PHP 文件实际上是用于本地化的。

标签: php utf-8 file-encodings


【解决方案1】:

有几个陷阱需要注意:

  1. PHP 不知道某些编辑器或 IDE 喜欢放在 UTF-8 文件开头的 BOM 字符。该字符表示该文件是 UTF-8,但不是必需的,它是不可见的。这可能会导致处理 HTTP 标头的函数发出“标头已发送”警告,因为 PHP 会在看到 BOM 时将 BOM 输出到浏览器,这将阻止您发送任何标头。确保您的文本编辑器具有 UTF-8 (No BOM) 编码;如果您不确定,只需进行测试即可。如果 <?php header('Content-Type: text/html') ?> 在原本为空的文件的开头没有触发警告,那就没问题了。
  2. 默认字符串函数不支持多字节编码。这意味着strlen 真正返回字符串中的字节数,而不是实际的字符数。在您开始使用 substr 之类的函数拼接非 ASCII 字符串之前,这并不是什么大问题:当您这样做时,传递给它的索引指的是字节索引而不是字符索引,这可能会导致您的脚本将非 ASCII 字符一分为二。例如,echo substr("é", 0, 1) 将返回一个无效的 UTF-8 字符,因为在 UTF-8 中,é 实际上需要两个字节,而 substr 将只返回第一个字节。 (解决方案是使用mb_ string functions,它知道多字节编码。)
  3. 您必须确保您的数据源(如外部文本文件或数据库)也返回 UTF-8 字符串,因为 PHP 不会进行自动转换。为此,您可以使用特定于实现的方法(例如,MySQL 有一个特殊查询,可让您指定您期望结果的编码:SET CHARACTER SET UTF8 或类似的东西),或者如果您找不到更好的方法是,mb_convert_encodingiconv 会将一个字符串转换为另一种编码。

【讨论】:

  • 好答案。只是想补充一点,字符串函数有“多字节替换”,例如mb_strlen()mb_substr()
  • +1 不错的打字速度:)(也不错的答案)。当我看到您的答案时,我正在编辑我的答案以添加有关 BOM 和 mb_* 函数的详细信息:)。
【解决方案2】:

实际上通常建议您将所有源代码保存为 UTF8。带有拉丁字符的常规代码的大小根本不重要,但可以防止任何特殊字符出现故障。

【讨论】:

    【解决方案3】:

    如果您在例如字符串值中使用任何特殊字符,则大小会稍大一些,但这无关紧要。

    不过我的建议是,始终保留默认格式。我花了这么多时间,因为格式保存出错并且所有字符都更改了。

    从少数技术角度来看,没有区别!

    【讨论】:

    • 因为默认值因编辑器而异(其中一些从环境中提取它,这又会有所不同)。将其保留为默认值是一个非常糟糕的主意。最好选择一种编码,然后确保一切都使用它。
    【解决方案4】:

    非常相关,PHP 解析器可能会开始输出虚假字符,例如时髦的倒置问号。坚持规范,这是首选。

    【讨论】:

    • -1,UTF-8 应该是标准,即使在 PHP 中也是如此。在处理字符串时,您只需要使用多字节感知函数来避免时髦的问号字符。
    • UTF-8 是标准。替代品是 UTF-16(对亚洲更好)、UTF-32(错误,否)、ISO-8859(旧版)、ASCII(有限)和专有的东西。
    • 我能问一下为什么我被降级了吗?我的回答是正确的,继续用 Unicode 编码你的 PHP 文档,你不会得到任何输出,这验证了我的说法。此外,除非用户更改了设置,否则 ANSI 在所有文本编辑器中都是正常的,这对于 C#/C++/VB/PHP/JS 等等都是如此。
    • ANSI 可能是 Windows 上的默认值,但 UTF-8 是 Mac OS 和 Linux 上的默认值。我,一方面,使用 Mac OS,我所有的脚本(有很多法语重音字母)都用 UTF-8 编码,它们运行正常,不仅在我的机器上,而且在我使用和拥有的许多 Web 服务器上用过的。然而,一些陷阱;我已经在我的回答中列出了它们。
    • 我对“PHP 文档”的定义是一个包含可供 PHP 脚本引擎执行的 PHP 代码的文档。我将这些文档编码为 UTF-8,它们不仅可以在我的机器上工作,而且它们还可以在我使用的所有 Web 服务器上以非英文字符可移植地工作。您是指其他类型的文件吗?
    猜你喜欢
    • 2014-10-27
    • 2010-12-22
    • 2013-07-29
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多