运行时配置
这些函数的行为受php.ini中的设置影响。
名字 | 默认 | 可修改范围 | 更新日志 |
---|---|---|---|
mbstring.language | "neutral" | PHP_INI_ALL | 自 PHP 4.3.0 起有效。 PHP_INI_PERDIR 位于 PHP <= 5.2.6 |
mbstring.detect_order | NULL | PHP_INI_ALL | 自 PHP 4.0.6 起有效。 |
mbstring.http_input | "pass" | PHP_INI_ALL | 自 PHP 4.0.6 起有效。 |
mbstring.http_output | "pass" | PHP_INI_ALL | 自 PHP 4.0.6 起有效。 |
mbstring.internal_encoding | NULL | PHP_INI_ALL | 自 PHP 4.0.6 起有效。 |
mbstring.script_encoding | NULL | PHP_INI_ALL | 自 PHP 4.3.0 起有效。 在 PHP 5.4.0. 中移除, 使用 zend.script_encoding 代替。 |
mbstring.substitute_character | NULL | PHP_INI_ALL | 自 PHP 4.0.6 起有效。 |
mbstring.func_overload | "0" | PHP_INI_SYSTEM | PHP 4.3 到 5.2.6 是 PHP_INI_PERDIR,否则是 PHP_INI_SYSTEM。 自 PHP 4.2.0 起有效。 PHP 7.2.0 中废弃。 |
mbstring.encoding_translation | "0" | PHP_INI_PERDIR | 自 PHP 4.3.0 起有效。 |
mbstring.http_output_conv_mimetypes | "^(text/|application/xhtml\+xml)" | PHP_INI_ALL | Available since PHP 5.3.0. |
mbstring.strict_detection | "0" | PHP_INI_ALL | 自 PHP 5.1.2 起有效。 |
mbstring.language
stringmbstring 使用了国家默认语言设置(NLS)。 注意,该选项自动地定义了mbstring.internal_encoding和mbstring.internal_encoding,在php.ini里应当放置在mbstring.language之后。
mbstring.encoding_translation
boolean为传入的 HTTP 查询启用透明字符编码过滤器,将检测和转换输入的编码为内部字符编码(internal character encoding)。
mbstring.internal_encoding
stringWarning
This feature has beenDEPRECATEDas of PHP 5.6.0. Relying on this featureis highly discouraged.
定义内部字符的默认编码。
PHP 5.6 及更新版的用户应该将此选项留空,并设置$default_charset作为代替。
mbstring.http_input
stringWarning
This feature has beenDEPRECATEDas of PHP 5.6.0. Relying on this featureis highly discouraged.
定义 HTTP 输入字符的默认编码。
PHP 5.6 及更新版的用户应该将此选项留空,并设置$default_charset作为代替。
mbstring.http_output
stringWarning
This feature has beenDEPRECATEDas of PHP 5.6.0. Relying on this featureis highly discouraged.
定义 HTTP 输出字符的默认编码。
PHP 5.6 及更新版的用户应该将此选项留空,并设置$default_charset作为代替。
mbstring.detect_order
string定义字符编码的默认检测顺序。参见 mb_detect_order()。
mbstring.substitute_character
string为无效编码的字符定义替代字符。 参见 mb_substitute_character() ,查看支持的值。
mbstring.func_overload
stringWarning
This feature has beenDEPRECATEDas of PHP 7.2.0. Relying on this featureis highly discouraged.
用 mbstring 对应的函数覆盖单字节版本的函数集。更多信息参见函数的覆盖。
该设置仅能通过php.ini文件来修改。
mbstring.http_output_conv_mimetypes
stringmbstring.strict_detection
boolean使用严格的编码检测。
支持的字符编码
当前mbstring模块支持以下的字符编码。这些字符编码中的任意一个都能指定到mbstring函数中的encoding参数。
该 PHP 扩展支持的字符编码有以下几种:
- UCS-4*
- UCS-4BE
- UCS-4LE*
- UCS-2
- UCS-2BE
- UCS-2LE
- UTF-32*
- UTF-32BE*
- UTF-32LE*
- UTF-16*
- UTF-16BE*
- UTF-16LE*
- UTF-7
- UTF7-IMAP
- UTF-8*
- ASCII*
- EUC-JP*
- SJIS*
- eucJP-win*
- SJIS-win*
- ISO-2022-JP
- ISO-2022-JP-MS
- CP932
- CP51932
- SJIS-mac** (别名: MacJapanese)
- SJIS-Mobile#DOCOMO** (别名: SJIS-DOCOMO)
- SJIS-Mobile#KDDI** (别名: SJIS-KDDI)
- SJIS-Mobile#SOFTBANK** (别名: SJIS-SOFTBANK)
- UTF-8-Mobile#DOCOMO** (别名: UTF-8-DOCOMO)
- UTF-8-Mobile#KDDI-A**
- UTF-8-Mobile#KDDI-B** (别名: UTF-8-KDDI)
- UTF-8-Mobile#SOFTBANK** (别名: UTF-8-SOFTBANK)
- ISO-2022-JP-MOBILE#KDDI** (别名: ISO-2022-JP-KDDI)
- JIS
- JIS-ms
- CP50220
- CP50220raw
- CP50221
- CP50222
- ISO-8859-1*
- ISO-8859-2*
- ISO-8859-3*
- ISO-8859-4*
- ISO-8859-5*
- ISO-8859-6*
- ISO-8859-7*
- ISO-8859-8*
- ISO-8859-9*
- ISO-8859-10*
- ISO-8859-13*
- ISO-8859-14*
- ISO-8859-15*
- ISO-8859-16*
- byte2be
- byte2le
- byte4be
- byte4le
- BASE64
- HTML-ENTITIES
- 7bit
- 8bit
- EUC-CN*
- CP936
- GB18030**
- HZ
- EUC-TW*
- CP950
- BIG-5*
- EUC-KR*
- UHC (CP949)
- ISO-2022-KR
- Windows-1251 (CP1251)
- Windows-1252 (CP1252)
- CP866 (IBM866)
- KOI8-R*
- KOI8-U*
- ArmSCII-8 (ArmSCII8)
* 表示该编码也可以在正则表达式中使用。
** 表示该编码自 PHP 5.4.0 始可用。
任何接受编码名称的php.ini条目同样也可以使用 "auto" 和 "pass" 的值。 接受编码名的mbstring函数同样也可以使用值 "auto"。
如果设置了 "pass",将不会对字符的编码进行转化。
如果设置了 "auto",它将扩展成 NLS 中定义的每个字符编码列表。 比如,假设 NLS 设置为Japanese,值将会认为是 "ASCII,JIS,UTF-8,EUC-JP,SJIS"。
参见 mb_detect_order()
PHP字符编码的要求
以下类型的编码能够被 PHP 安全地使用。
单字节编码
- ASCII兼容(ISO646 兼容),在00h到7fh的范围内映射字符集。
多字节编码,
- ASCII兼容,在00h到7fh的范围内映射字符集。
- 不使用 ISO2022 转义序列(escape sequences)。
- 单个字符以任意复合字节表达、不使用00h到7fh的值。
有几个不太可能用 PHP 运行的字符编码例子。 虽然用任何其中一个编码来编写 PHP 脚本可能无法工作,尤其是这些编码的字符串以标识符(identifier)和字符(literal)出现, 但通过设置mbstring透明地过滤编码的函数,你几乎可以避免传入的 HTTP 查询使用这些编码。 Note: 我们极度不赞成在内部编码中使用 SJIS、BIG5、CP936、CP949 和 GB18030,除非你熟悉解析器(parser)、扫描器(scanner)和该字符编码。 Note: 当你用 PHP 连接到一个数据库,为了易用性和性能,推荐在数据库和内部编码使用一致的字符编码。 如果你使用的是 PostgreSQL,数据库里使用的编码和 PHP 里使用的编码可以是不同的,因为它支持字符集在前端和后端之间进行自动转换。 This feature has beenDEPRECATEDas of PHP 7.2.0. Relying on this featureis highly discouraged.
JIS, SJIS, ISO-2022-JP, BIG-5
函数重载功能
Warning
你也许常常会发现现存的 PHP 应用很难运行在多字节环境下。 发生这种情况的原因是大多数那种 PHP 应用使用了标准的字符串函数,类似 substr(),已知无法处理多字节编码的字符串。
mbstring 支持一个“函数重载”功能,将对应的多字节版本重载到标准字符处理函数上,例如你能够让这类应用在不修改代码的前提下添加多字节的处理能力。 比如,启用函数重载后,mb_substr() 将会代替 substr() 被调用。 在很多情况下这个功能允许让仅支持单字节编码的应用简单地和多字节环境对接。
要使用函数重载功能,设置php.ini里的mbstring.func_overload为正值,就是表示为重载函数分类的位掩码组合。 要重载 mail() 函数需要设置它为 1。字符串函数设置为 2,正则表达式函数为 4。 例如,当它设置为 7, mail、strings 和 正则表达式函数将都会被重载。 以下列表显示了重载的函数。
mbstring.func_overload 的值 | 原始函数 | 重载后的函数 |
---|---|---|
1 | mail() | mb_send_mail() |
2 | strlen() | mb_strlen() |
2 | strpos() | mb_strpos() |
2 | strrpos() | mb_strrpos() |
2 | substr() | mb_substr() |
2 | strtolower() | mb_strtolower() |
2 | strtoupper() | mb_strtoupper() |
2 | stripos() | mb_stripos() |
2 | strripos() | mb_strripos() |
2 | strstr() | mb_strstr() |
2 | stristr() | mb_stristr() |
2 | strrchr() | mb_strrchr() |
2 | substr_count() | mb_substr_count() |
4 | ereg() | mb_ereg() |
4 | eregi() | mb_eregi() |
4 | ereg_replace() | mb_ereg_replace() |
4 | eregi_replace() | mb_eregi_replace() |
4 | split() | mb_split() |
Note:
不推荐每个目录的范围(context)内使用函数重载选项,因为还无法确定在生产环境中是否稳定,也许会导致不确定的行为。
HTTP 输入和输出
HTTP 输入/输出字符编码转换同样也适用于二进制数据。 如果 HTTP 输入/输出用到了二进制数据,用户应当控制字符的编码转换。
Note:
如果 HTML 表单的enctype属性设置为multipart/form-data,并且php.ini里的mbstring.encoding_translation设置为 On, POST 的变量以及上传文件的名称也将会被转换到内部字符编码。 不过,转换不会应用于查询(query)的键。
- HTTP 输入
在 PHP 脚本里无法控制 HTTP 输入字符的转换。 要禁用 HTTP 输入字符的转换,必须要在php.ini里设置。
Example #1 在php.ini中禁用 HTTP 输入转换
;; 禁用 HTTP 输入转换 mbstring.http_input = pass ;;禁用 HTTP 输入转换 mbstring.encoding_translation = Off
当 PHP 以 Apache 模块运行。这些设置还可以通过httpd.conf内每个虚拟主机(Virtual Host)指令或每个目录下的.htaccess来覆盖(override)。 详情参见配置这一节,以及 Apache 手册。
- HTTP 输出
输出字符编码转换的使用有几种方式。 一种是使用php.ini,另一种是使用 ob_start(),以 mb_output_handler() 作为ob_start的回调函数。
Example #2php.ini设置例子
;; 为所有 PHP 页面启用输出字符编码的转换 ;; 启用输出缓冲 output_buffering = On ;; 设置 mb_output_handler 来进行输出的转换 output_handler = mb_output_handler
Example #3 脚本例子
<?php // 仅为此页面启用输出字符编码的转换 // 设置 HTTP 输出字符编码为 SJIS mb_http_output('SJIS'); // 开始缓冲并指定 "mb_output_handler" 为回调函数 ob_start('mb_output_handler'); ?>