- 这究竟是做什么的?该指令如何影响脚本的行为?
来自 php.ini:
; 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 =
来自 php.net:
在编译文件时处理....
可以使用 encoding 指令为每个脚本指定脚本的编码。
换句话说,如果设置了 zend.multibyte 指令,则可以使用每个 PHP 文件顶部的可选声明指令来声明每个文件的字符编码。这意味着您可以让每个 PHP 文件具有不同的编码,只要您在每个 PHP 文件的顶部声明它们的编码,并且每个文件中包含的字符串文字将在编译时透明地转换为 internal_encoding 中的设置php.ini(在 PHP 7.4.6 中测试)。 default_charset 和 internal_encoding 配置选项未更改,并且您的代码不知道原始编码,因为转换是在编译时进行的。
- 这与设置指令 mbstring.internal_encoding(PHP 5.6 之前)和 default_charset(PHP 5.6 起)或使用 mb_internal_encoding() 函数有何不同?
internal_encoding 指令(以前的 mbstring.internal_encoding)
每个文件顶部声明的字符编码是该文件的实际编码,而 php.ini 中的 internal_encoding 设置是所需的字符编码。因此,如果您希望您的代码看到 UTF-8 但您的 PHP 文件保存在 Windows-1252 中,您可以将 php.ini 中的 internal_encoding 设置为 UTF-8,同时在每个文件的顶部放置一个声明指令,说明它们被编码为 Windows-1252,其中包含的字符串文字将在编译时转换为 UTF-8。 (在 PHP 7.4.6 中测试)
php.net:
此设置用于多字节模块,例如 mbstring 和 iconv。
php.ini:
如果为空,则使用 default_charset。
有关更多信息,请参阅下面的 mb_internal_encoding() 函数
mb_internal_encoding 函数
在运行时设置 mb_internal_encoding 会告诉您的 mb_* 函数您正在使用哪种多字节编码,以便调用 mb_strtolower 等函数将能够识别您的多字节字符,以便它们可以用它们的小写等价物替换它们。如果你没有在运行时设置它,它将假定在 php.ini 中的 internal_encoding 指令中设置的编码。
mb_internal_encoding 函数在运行时执行,因此不能用于告诉 PHP 每个 PHP 文件声明的编码在编译时应转换为什么。 (见上文。)
来自 PHP.net:
[Set/Get] 用于HTTP输入字符编码转换、HTTP输出字符编码转换以及mbstring模块定义的字符串函数的默认字符编码的字符编码名称。您应该注意到内部编码与多字节正则表达式的内部编码完全不同。
default_charset 指令
设置 default_charset 指令告诉 PHP 在内容类型 HTTP 响应标头中使用什么值。例如内容类型:text/html; charset=UTF-8
该指令还告诉 PHP 在某些函数(例如 htmlspecialchars 和 htmlentities)中查找什么字符编码。例如,如果您的 default_charset 是 UTF-8,但您的数据库设置为使用 latin1,那么如果未将 Windows-1252 指定为编码,则 htmlspecialchars 将遇到非 ascii 字符的问题,因为 Windows-1252 包含在 UTF 中被视为无效的字节序列-8。如果 internal_encoding 没有明确设置,它也被用作 internal_encoding。
来自 php.net
default_charset 字符串
在 PHP 5.6 以后,“UTF-8”是默认值,它的值被用作 htmlentities() 的默认字符编码,
html_entity_decode() 和 htmlspecialchars() 如果编码参数
被省略。 default_charset 的值也将用于设置
iconv 函数的默认字符集,如果 iconv.input_encoding,
iconv.output_encoding 和 iconv.internal_encoding 配置
选项未设置,对于 mbstring 函数,如果
mbstring.http_input mbstring.http_output mbstring.internal_encoding
配置选项未设置。
如果标头没有被覆盖,所有版本的 PHP 都将使用此值作为 PHP 发送的默认 Content-Type 标头中的字符集
通过调用 header()。
不建议将 default_charset 设置为空值。