特别是在编写用于不同服务器的 PHP 脚本时,强烈建议在每个提供的文档的顶部明确设置内部编码,例如
mb_internal_encoding("UTF-8");
这与 mysql 语句“SET NAMES 'utf8'”相结合,将节省大量调试问题。
此外,使用多字节字符串函数而不是您可能习惯使用的函数,例如 mb_strlen() 而不是 strlen() 等。
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_internal_encoding — 设置/获取内部字符编码
encoding
encoding
是用于 HTTP 输入字符编码转换、HTTP 输出字符编码转换以及 mbstring 模块定义的字符串函数的默认字符编码的字符编码名称。您应该注意,内部编码与多字节正则表达式的编码完全不同。
从 PHP 8.0.0 开始,如果 encoding
的值是无效的编码,则会抛出 ValueError。在 PHP 8.0.0 之前,会发出 E_WARNING
。
版本 | 描述 |
---|---|
8.0.0 |
encoding 现在可以为空。 |
8.0.0 | 如果 encoding 是无效的编码,现在会抛出 ValueError。之前会发出 E_WARNING 。 |
示例 #1 mb_internal_encoding() 示例
<?php
/* 将内部字符编码设置为 UTF-8 */
mb_internal_encoding("UTF-8");
/* 显示当前内部字符编码 */
echo mb_internal_encoding();
?>
特别是在编写用于不同服务器的 PHP 脚本时,强烈建议在每个提供的文档的顶部明确设置内部编码,例如
mb_internal_encoding("UTF-8");
这与 mysql 语句“SET NAMES 'utf8'”相结合,将节省大量调试问题。
此外,使用多字节字符串函数而不是您可能习惯使用的函数,例如 mb_strlen() 而不是 strlen() 等。
全部放在一起
<?php
// ------------------------------------------------------------
header('Content-Type: text/html; charset=UTF-8');
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');
mb_regex_encoding('UTF-8');
// ------------------------------------------------------------
?>
请注意,源文件中的字符串必须与您通过 mb_internal_encoding 指定的编码匹配。解析器似乎从文件中加载原始字节,并参考其内部编码来确定它们的实际编码。
为了说明这一点,当 /source/ 文件为 Latin-1 编码时,以下输出符合预期
<?php
mb_internal_encoding("iso-8859-1");
mb_http_output( "UTF-8" );
ob_start("mb_output_handler");
echo "???<br/>";
?>???
现在,mb_internal_encoding 的典型用法如下所示。将更改为“utf-8”,但保持 /source/ 文件编码不变
<?php
mb_internal_encoding("UTF-8");
mb_http_output( "UTF-8" );
ob_start("mb_output_handler");
echo "???<br/>";
?>???
输出将只显示 <br/> 标签,没有文本。
将文件保存为 UTF-8 编码,然后结果将符合预期。
回复 mortoray at ecircle-ag dot com
只要您将编码设置为更“Latin 1”兼容的内容(即 US-ACSII、ISO-8859-1、ISO-8859-1 或 Windows 1252),字符就会正常显示。PHP.net 自动检测为 UTF-8
我注意到,在我的全局网站配置文件 config.inc.php 中设置 mb_internal_encoding('UTF-8') 在我的类中不起作用:它又恢复为 ISO-8859-1。
在我的顶级网站类的构造函数中添加调用解决了这个问题。
对于前面的示例,PHP 注释似乎不支持带变音符号的字符,因此那里有问号 (?) 而不是应该有的带变音符号的字符。只需替换任何高阶/带重音符号的字符即可看到效果。