【问题标题】:What does zend.multibyte directive exactly affect?zend.multibyte 指令到底有什么影响?
【发布时间】:2013-06-14 18:52:27
【问题描述】:

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

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

【问题讨论】:

    标签: php php-ini


    【解决方案1】:

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

    【讨论】:

    • 所以,我需要它——如果我必须使用日语本地化(UTF 格式),或者如果我使用 UTF,我不需要考虑它?
    • UTF-8 没有它也能正常工作。这是关于 ASCII 不兼容的多字节编码
    • Shift_JIS 是可能引起麻烦的一种。在 Shift_JIS 中,字符的第二个字节可能与解析器中具有特殊含义的 ASCII 字符发生冲突。使用 utf-8 时,所有字节要么代表 ASCII 字符,要么位于上限
    【解决方案2】:

    它的重点是影响脚本解析。正如 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. 通过在每个 PHP 的顶部添加 declare(encoding=...); 文件。

    来自 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 =
    

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 2018-01-23
      • 2015-02-17
      • 2019-01-31
      • 2011-04-28
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多