我构建工具来分析源代码。此类工具必须正确读取源代码文件,尤其是在字符编码方面。例如,“字符串文字中精确的字节字符串是什么?” (PHP 文字和 HTML 文本)。
我可能错误的理解是 PHP 源文件只是 8 位字符(也就是说,PHP 引擎以这种方式读取它们[对]?,因为它们应该只包含 8 位字符)。但是,八位字符采用哪种编码?(我想是为了匹配 ISO-8859-1 (-x?) [有人能引用章节吗?和大多数欧洲国家/字符集的字符串。
但很明显,这对 Unicode 来说是有问题的。据我所知,大多数 PHP 应用程序处理 Unicode 本质上是通过将包含 UTF-8 字节序列的字符串插入 8 位 PHP 字符串中。在此之后,如果您告诉服务器您正在生成 UTF-8 文本,则可以生成其 HTML 包含 Unicode UTF-8 序列的脚本。
对于上述情况,可以将 PHP 文件读取为 8 位字符文本,这在我看来与语言匹配。
令我困惑的是编码为 UTF-8 的 PHP 源文件(Joomla 包有大约 1800 个源文件,其中大约 10 个是 UTF-8,其余不是)。在 UTF-8 渲染中正确显示的任何(非 ASCII)欧洲字符实际上都被编码为多字节序列。我想以 UTF-8 形式提供的此类页面将正确呈现 HTML。但是,在文本编辑器中明显正确呈现的欧洲字符或其他 Unicode 字符的任何字符串比较根本不起作用。字符串文字不会包含它们看起来包含的内容。程序员使用 UTF-8 文件是因为这是编辑器提供的吗?他们是故意这样做的吗?还是只是一个对大多数工作无关紧要的事故?
那么,应该如何读取 PHP 源文件呢?(特别是,用什么字符编码?)一个可能的答案是,总是作为 ISO-8859-1 8 位代码,不管实际内容或 BOM (我看到很多 UTF-8 BOM 标记的 PHP 文件)。另一个答案是 UTF-8,如果有标记的话。
[我们的工具读取和写入任意编码。一个“微不足道”的工具是一个字符中的读取文件编码,在另一种编码中写入相同的代码点。以这种方式读取 UTF-8 PHP 文件会使我们在编写 ISO8859-1 等效文件时遇到麻烦,因为许多 UTF-8 代码点(例如,欧元符号)无法在 ISO8859-x 中编码。]
编辑 8 月 30 日:我们现在检查 PHP 文件以查看它们是否具有 UTF-8 BOM,或者是否具有所有合法的 UTF-8 序列。在这两种情况下,我们都将文件读取为 UTF-8;否则我们默认将其读取为 ISO8859-1。如果我们修改它,我们现在保留文件编码。(把这一切做好是相当多的工作)。这似乎是一个安全的策略,但这可能与 PHP 程序员所期望的不同。