3

多年来,我对所有 php 脚本都使用没有 BOM 的 UTF8 编码,它们工作正常。今天我发现有一个名为 的核心指令zend.multibyte,默认为零(禁用)。

那么,如果它不影响脚本解析.. 它究竟会影响什么?

4

2 回答 2

5

ASCII 不兼容的编码需要 Zend Multibyte,例如一些来自 pre-unicode/pre-utf-8 时代的亚洲编码,主要用于日本。启用后,解析器将检查 mbstring.script_encoding 并在解析时使用该编码。由于内部发生了一些转换,因此应该避免这种情况,但对于某些用户来说,这是他们可以使用 PHP 的唯一方式。

于 2013-06-18T14:59:57.403 回答
1

它的重点是影响脚本解析。正如 johannes 所说,一个目的是用于与 ASCII 不兼容的编码。(UTF-8 与 ASCII 兼容,这就是你不需要它的原因。)

但它也可用于在编译时透明地转换脚本编码。假设由于某种原因您的文本编辑器只能保存为 ANSI,但您需要您的代码才能看到 UTF-8。打开 zend.multibyte 并将脚本的编码声明为 Windows-1252 将允许您将脚本编码为 ANSI,PHP 将透明地将它们包含的字符串文字从 ANSI 转换为 php.ini 的 internal_encoding 指令中设置的编码(默认是 UTF-8)。由于这发生在编译时,对于您的代码,您的脚本都将包含 UTF-8。

您可以通过两种方式声明脚本的编码。

  1. 通过在 php.ini 中设置 zend.script_encoding 指令
  2. 通过添加declare(encoding=...); 在每个 PHP 文件的顶部。

来自 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 =
于 2020-09-20T06:58:30.633 回答