2024 年 PHP 日本研討會

執行時期設定

這些函式的行為會受到 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.inimbstring.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 規格,網頁瀏覽器允許以不同於網頁所使用的字元編碼來編碼提交的表單。請參閱 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 php.ini 設定 (適用於 EUC-JP 使用者)

;; 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 php.ini 設定 (適用於 SJIS 使用者)

;; 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 則註解

0
ASchmidt at Anamera dot net
6 年前
關於「mbstring.language」有效的「NLS」語言字串究竟是什麼,文件說明得不夠清楚。

根據 https://php.dev.org.tw/manual/en/function.mb-language.php,有效值為「Japanese」、「ja」、「English」、「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"
?>
0
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