【问题标题】:PHP declare encodingPHP 声明编码
【发布时间】:2015-02-01 12:15:18
【问题描述】:

declare() page of the PHP manual

编码

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

示例 #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 encoding utf-8 declare


    【解决方案1】:

    PHP 5.6 附带了一个新的默认字符集指令,设置为 UTF-8,在某些情况下,这可能是在元标记中作为 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) 页面,您可以使用相同的方式强制编码,但使用 utf-8 代替 iso-8859-1 .看那个:

    例如:config.php

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

    希望我的回答对你有用,我就是这样解决了我的问题!

    【讨论】:

    • 感谢您的回答,但问题是关于 PHP 的 declare 函数在用于声明编码时、它的作用以及它与其他声明字符集的方式(例如您在此处提出的方式)有何不同。
    【解决方案2】:
    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:

    在编译文件时处理....

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

    换句话说,如果设置了 zend.multibyte 指令,则可以使用每个 PHP 文件顶部的可选声明指令来声明每个文件的字符编码。这意味着您可以让每个 PHP 文件具有不同的编码,只要您在每个 PHP 文件的顶部声明它们的编码,并且每个文件中包含的字符串文字将在编译时透明地转换为 internal_encoding 中的设置php.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:

    [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 设置为空值。

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 2016-11-08
      • 2016-11-06
      • 1970-01-01
      • 2012-08-27
      • 2015-10-08
      • 2014-10-18
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多