PHP 声明编码



在 PHP 手册的declare()页上:

编码

可以使用编码为每个脚本指定脚本的编码 命令。

示例 #3 声明脚本的编码。

<?php
declare(encoding='ISO-8859-1');
// code here
?>
  1. 这到底是做什么的?脚本的行为如何受此指令影响?

  2. 这与设置指令mbstring.internal_encoding(PHP 5.6 之前(和default_charset(PHP 5.6 之前(或使用 mb_internal_encoding() 函数有何不同?

(我同时使用 PHP 5.3 和 5.5。目前我的文件以 UTF-8 格式保存,我在提供 HTML 文件时发送标头Content-Type: text/html; charset=utf-8

PHP 5.6 附带一个新的默认字符集指令设置为 UTF-8 ,在某些情况下,这可能是在 metatag 中作为 latin1 提供的页面的问题,您可以通过在脚本中调用 ini_set('default_charset', 'iso-8859-1') 来覆盖此指令。

为此,请在脚本开头将要编码为latin1的每个php文件放在以下代码上:

示例:index.php

<?php
  $server_root = realpath($_SERVER["DOCUMENT_ROOT"]);
  $config_serv = "$server_root/php/config.php";
  include("$config_serv");
?>

然后在根网站下创建一个文件夹"php",并将这段代码放入config.php

示例:config.php

<?php
  ##########################################################################
  # Server Directive - Override default_charset utf-8 to latin1 in php.ini #
  ##########################################################################
  @ini_set('default_charset', 'ISO-8859-1');
?>

如果你的 php.ini 设置为 latin1 ( ISO-8859-1 ( 并且你想要提供一个 utf-8 (unicode( 页面,你可以使用相同的方式强制编码,但放 而不是 iso-8859-1, utf-8。看啊:

示例:config.php

<?php
  ##########################################################################
  # Server Directive - Override default_charset latin1 to utf-8 in php.ini #
  ##########################################################################
  @ini_set('default_charset', 'UTF-8');
?>

我希望你觉得我的答案有用,我用这种方式解决了我的问题!

  1. 这到底是做什么的?脚本的行为如何受此指令影响?

从 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:

在文件正在编译时处理。

可以使用编码指令为每个脚本指定脚本的编码。

换句话说,如果设置了 zend.multibyte 指令,则可以使用每个 PHP 文件顶部的可选声明指令来声明每个文件的字符编码。这意味着只要在每个 PHP 文件的顶部声明它们的编码,就可以让每个 PHP 文件采用不同的编码,并且每个文件中包含的字符串文字将在编译时透明地转换为 php 中设置的internal_encoding.ini(在 PHP 7.4.6 中测试(。default_charset 和internal_encoding配置选项不会更改,并且您的代码不知道原始编码,因为转换是在编译时发生的。

  1. 这与设置指令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:

[设置/获取] 用于 HTTP 输入字符编码转换、HTTP 输出字符编码转换的字符编码名称,以及 mbstring 模块定义的字符串函数的默认字符编码。您应该注意到,内部编码与多字节正则表达式的编码完全不同。

default_charset指令

设置 default_charset 指令会告诉 PHP 要在内容类型 HTTP 响应标头中使用什么值。例如内容类型:文本/html;字符集=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配置选项未设置,对于 MB字符串函数,如果mbstring.http_input mbstring.http_output mbstring.internal_encoding配置选项未设置。

所有版本的 PHP 都将使用此值作为 PHP 发送的默认 Content-Type 标头中的字符集(如果未覆盖该标头(通过调用 header((。

不建议将default_charset设置为空值。

最新更新