【发布时间】:2010-04-01 04:44:58
【问题描述】:
我正在编写一些带注释的 PHP 类,但偶然发现了一个问题。我的名字(对于@author 标签)以 ș 结尾(这是一个 UTF-8 字符,......而且我知道一个奇怪的名字)。
尽管我将文件保存为 UTF-8,但一些朋友报告说他们看到这个字符完全搞砸了 (È™)。通过添加 BOM 签名可以解决此问题。但是那件事让我有点困扰,因为我对此知之甚少,除了我在 Wikipedia 上看到的以及 SO 上的其他一些类似问题。
我知道它在文件的开头添加了一些东西,据我了解,这并没有那么糟糕,但我很担心,因为我读到的唯一有问题的场景涉及 PHP 文件。而且由于我正在编写 PHP 类来共享它们,因此 100% 兼容比在 cmets 中有我的名字更重要。
但我正在尝试理解其中的含义,我是否应该放心使用它?或者是否有可能造成损害的情况?什么时候?
【问题讨论】:
-
请注意,今天我遇到了一个问题,其中包含的 PHP 文件顶部的
<?php die('test')在文件顶部显示 UTF-8 BOM(这些字符:) .很难弄清楚。就在那时,我发现其中一位开发人员将文件保存为 Unicode,而不是 ASCII,并且这个 PHP 无法读取 Unicoded PHP 文件。我开始了一个新的副本,复制了数据并以 ASCII 格式保存,问题就解决了。请注意,如果您遇到这种情况,某些 FTP 程序可以对您执行此操作。 -
另请注意,当页面出现此 UTF-8 BOM 问题时,会话变量似乎无法跨页面正常工作。我不得不在 Ubuntu 上使用像 ghex 这样的十六进制编辑器加上
iconv -f utf8 -t ascii old.php > new.php反复检测所有的 Unicode 问题,删除它们,并最终以 ASCII 格式保存页面,而 iconv 命令没有错误。完成后,我注意到页面之间的会话变量保持状态。 -
似乎当在文件中检测到 UTF-8 BOM 时,不会发送保持会话的标头,因此页面之间的会话变量将获得全新的会话,而不是保持相同的会话。跨度>
-
并不是 PHP “检测” BOM 并且 - 如果存在 - “决定”丢弃会话变量 - 问题是 PHP(至少我见过这样做的版本)读取文件,读取一个ï,打印它,读取一个»,打印它,读取一个¿,打印它......现在的问题是 session_start() 导致一些标题通信,这只能在我们仍在标题中时发生- 沟通阶段 - 打印一些东西结束了这个阶段。如果您将“display_errors”ini 变量设置为“On”,您会收到一条消息,告诉您 session_start 由于这个原因而失败
标签: php utf-8 character-encoding byte-order-mark