多年来,我对所有 php 脚本都使用没有 BOM 的 UTF8 编码,它们工作正常。今天我发现有一个名为 的核心指令zend.multibyte
,默认为零(禁用)。
那么,如果它不影响脚本解析.. 它究竟会影响什么?
ASCII 不兼容的编码需要 Zend Multibyte,例如一些来自 pre-unicode/pre-utf-8 时代的亚洲编码,主要用于日本。启用后,解析器将检查 mbstring.script_encoding 并在解析时使用该编码。由于内部发生了一些转换,因此应该避免这种情况,但对于某些用户来说,这是他们可以使用 PHP 的唯一方式。
它的重点是影响脚本解析。正如 johannes 所说,一个目的是用于与 ASCII 不兼容的编码。(UTF-8 与 ASCII 兼容,这就是你不需要它的原因。)
但它也可用于在编译时透明地转换脚本编码。假设由于某种原因您的文本编辑器只能保存为 ANSI,但您需要您的代码才能看到 UTF-8。打开 zend.multibyte 并将脚本的编码声明为 Windows-1252 将允许您将脚本编码为 ANSI,PHP 将透明地将它们包含的字符串文字从 ANSI 转换为 php.ini 的 internal_encoding 指令中设置的编码(默认是 UTF-8)。由于这发生在编译时,对于您的代码,您的脚本都将包含 UTF-8。
您可以通过两种方式声明脚本的编码。
来自 php.ini:
; If enabled, scripts may be written in encodings that are incompatible with
; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such
; encodings. To use this feature, mbstring extension must be enabled.
; Default: Off
;zend.multibyte = Off
; Allows to set the default encoding for the scripts. This value will be used
; unless "declare(encoding=...)" directive appears at the top of the script.
; Only affects if zend.multibyte is set.
; Default: ""
;zend.script_encoding =