PHP Conference Japan 2024

运行时配置

这些函数的行为受php.ini中的设置影响。

mbstring 配置选项
名称 默认值 可更改 变更日志
mbstring.language "neutral" INI_ALL  
mbstring.detect_order NULL INI_ALL  
mbstring.http_input "pass" INI_ALL 已弃用
mbstring.http_output "pass" INI_ALL 已弃用
mbstring.internal_encoding NULL INI_ALL 已弃用
mbstring.substitute_character NULL INI_ALL  
mbstring.func_overload "0" INI_SYSTEM 自 PHP 7.2.0 起弃用;自 PHP 8.0.0 起移除。
mbstring.encoding_translation "0" INI_PERDIR  
mbstring.http_output_conv_mimetypes "^(text/|application/xhtml\+xml)" INI_ALL  
mbstring.strict_detection "0" INI_ALL  
mbstring.regex_retry_limit "1000000" INI_ALL 自 PHP 7.4.0 起可用。
mbstring.regex_stack_limit "100000" INI_ALL 自 PHP 7.3.5 起可用。
有关 INI_* 模式的更多详细信息和定义,请参见配置设置的设置位置

以下是配置指令的简短说明。

mbstring.language 字符串

mbstring 中使用的默认国家/地区语言设置 (NLS)。请注意,此选项会自动定义mbstring.internal_encoding,并且mbstring.internal_encoding应放在php.ini中的mbstring.language之后。

mbstring.encoding_translation 布尔值

为传入的 HTTP 查询启用透明字符编码过滤器,该过滤器执行输入编码的检测和转换,将其转换为内部字符编码。

mbstring.internal_encoding 字符串
警告

此已弃用的功能将来一定会被移除

定义默认内部字符编码。

用户应将其留空并改为设置default_charset

mbstring.http_input 字符串
警告

此已弃用的功能将来一定会被移除

定义默认 HTTP 输入字符编码。

用户应将其留空并改为设置default_charset

mbstring.http_output 字符串
警告

此已弃用的功能将来一定会被移除

定义默认 HTTP 输出字符编码(输出将从内部编码转换为 HTTP 输出编码后输出)。

用户应将其留空并改为设置default_charset

mbstring.detect_order 字符串

定义默认字符代码检测顺序。另请参见mb_detect_order()

mbstring.substitute_character 字符串

定义用于替换无效字符编码的字符。有关支持的值,请参见mb_substitute_character()

mbstring.func_overload 字符串
警告

自 PHP 7.2.0 起此功能已弃用,自 PHP 8.0.0 起已移除。强烈建议不要依赖此功能。

通过 mbstring 对应项重载一组单字节函数。有关详细信息,请参见函数重载

此设置只能从php.ini文件更改。

mbstring.http_output_conv_mimetypes 字符串

mbstring.strict_detection 布尔值

启用严格编码检测。有关说明和示例,请参见mb_detect_encoding()

mbstring.regex_retry_limit 整数

限制在一次 mbregex 匹配期间可以执行的反向跟踪量。

此设置仅在链接到 oniguruma >= 6.8.0 时生效。

mbstring.regex_stack_limit 整数

限制 mbstring 正则表达式的堆栈深度。

根据» HTML 4.01 规范,Web 浏览器允许使用与页面使用的字符编码不同的字符编码对要提交的表单进行编码。请参见mb_http_input()以检测浏览器使用的字符编码。

尽管流行的浏览器能够对给定 HTML 文档的字符编码进行相当准确的猜测,但最好通过header()default_charset ini 设置,将Content-Type HTTP 标头中的charset参数设置为适当的值。

示例 #1 php.ini 设置示例

; Set default language
mbstring.language        = Neutral; Set default language to Neutral(UTF-8) (default)
mbstring.language        = English; Set default language to English 
mbstring.language        = Japanese; Set default language to Japanese

;; Set default internal encoding
;; Note: Make sure to use character encoding works with PHP
mbstring.internal_encoding    = UTF-8  ; Set internal encoding to UTF-8

;; HTTP input encoding translation is enabled.
mbstring.encoding_translation = On

;; Set default HTTP input character encoding
;; Note: Script cannot change http_input setting.
mbstring.http_input           = pass    ; No conversion. 
mbstring.http_input           = auto    ; Set HTTP input to auto
                                ; "auto" is expanded according to mbstring.language
mbstring.http_input           = SJIS    ; Set HTTP input to SJIS
mbstring.http_input           = UTF-8,SJIS,EUC-JP ; Specify order

;; Set default HTTP output character encoding 
mbstring.http_output          = pass    ; No conversion
mbstring.http_output          = UTF-8   ; Set HTTP output encoding to UTF-8

;; Set default character encoding detection order
mbstring.detect_order         = auto    ; Set detect order to auto
mbstring.detect_order         = ASCII,JIS,UTF-8,SJIS,EUC-JP ; Specify order

;; Set default substitute character
mbstring.substitute_character = 12307   ; Specify Unicode value
mbstring.substitute_character = none    ; Do not print character
mbstring.substitute_character = long    ; Long Example: U+3000,JIS+7E7E

示例 #2 EUC-JP 用户的php.ini 设置

;; Disable Output Buffering
output_buffering      = Off

;; Set HTTP header charset
default_charset       = EUC-JP    

;; Set default language to Japanese
mbstring.language = Japanese

;; HTTP input encoding translation is enabled.
mbstring.encoding_translation = On

;; Set HTTP input encoding conversion to auto
mbstring.http_input   = auto 

;; Convert HTTP output to EUC-JP
mbstring.http_output  = EUC-JP    

;; Set internal encoding to EUC-JP
mbstring.internal_encoding = EUC-JP    

;; Do not print invalid characters
mbstring.substitute_character = none   

示例 #3 SJIS 用户的php.ini 设置

;; Enable Output Buffering
output_buffering     = On

;; Set mb_output_handler to enable output conversion
output_handler       = mb_output_handler

;; Set HTTP header charset
default_charset      = Shift_JIS

;; Set default language to Japanese
mbstring.language = Japanese

;; Set http input encoding conversion to auto
mbstring.http_input  = auto 

;; Convert to SJIS
mbstring.http_output = SJIS    

;; Set internal encoding to EUC-JP
mbstring.internal_encoding = EUC-JP    

;; Do not print invalid characters
mbstring.substitute_character = none   

添加注释

用户贡献的注释 2 条注释

ASchmidt at Anamera dot net
6 年前
文档含糊不清,没有明确说明对于“mbstring.language”有效的“NLS”语言字符串究竟是什么。

根据https://php.net/manual/en/function.mb-language.php,这些值是“日语”、“ja”、“英语”、“en”或 UTF-8 的“uni”。
另一方面,本页上的示例省略了“uni”,但引入了“Neutral”作为未记录的选项,这也是默认值。

<?php
var_dump
( mb_language() ); // "neutral" (如果未设置则为默认值)
var_dump( mb_language( 'uni' ) ); // TRUE,有效的语言字符串
var_dump( mb_language() ); // "uni"
var_dump( mb_language( 'neutral' ) ); // TRUE,有效的语言字符串
var_dump( mb_language() ); // "neutral"
?>
Hayley Watson
6 年前
PHP 脚本中的字符串文字使用与保存 PHP 文件相同的编码进行编码。这不受 default_charset 或其他 .ini 设置的影响。

场景:default_charset 为 KOI8-R,并且有一个文本文件“input.txt”,其中包含用 KOI8-R 编码的字符串“Это текст для поиска.”。

编写了一个 PHP 脚本
<?php

// mb_internal_encoding('KOI8-R');

$string = 'текст.';

$data = file_get_contents('input.txt');

echo
mb_strpos($data, $string);

?>
但不幸的是,它被保存为 UTF-8。

它不起作用;mb_strpos() 返回 false,因为它找不到 KOI8-R 编码的“Это текст для поиска.”中的 UTF-8 编码的“текст”。

调整 default_charset 没有效果。甚至调整 mb_internal_encoding 也无法修复它,仅仅是因为所涉及的字符串具有*不同的*编码,并且如果没有实际更改其中一个字符串,它们就不会匹配。

将源文件重新保存为 KOI8-R 以匹配数据文件,或者将数据文件重新保存为 UTF-8 以匹配源代码。只有这样,脚本才能正确地回显“4”。
To Top