Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】mb_substitute_character()関数の使い方

mb_substitute_character関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

mb_substitute_character関数は、文字エンコーディングを変換する際に、変換できない不正な文字や未定義の文字をどの文字に置き換えるか(代替文字)を設定、または現在の設定値を取得するために使用される関数です。PHPのマルチバイト文字列関数は、文字エンコーディングの変換に失敗した文字を、デフォルトでは「?」(クエスチョンマーク)に置き換えます。この関数を使うことで、置き換えられる文字を任意の文字やUnicodeコードポイントに変更できます。また、引数に特殊な文字列として「none」を指定すると、代替処理を行わずにエンコーディング変換処理が失敗するようになり、エラーとして検知しやすくなります。一方、「long」を指定した場合は、「U+XXXX」といった16進数形式で文字のコードポイントが出力されます。引数を何も指定せずにこの関数を呼び出した場合は、現在設定されている代替文字の値を取得できます。この設定は、mb_convert_encoding関数など、文字エンコーディング変換を行う他の多くのマルチバイト文字列関数に影響を与え、文字化けの制御や厳密なデータ変換処理を実現するために利用されます。

構文(syntax)

1<?php
2
3mb_substitute_character(substitute_character: "?");

引数(parameters)

string|int|null $substitute_character = null

  • string|int|null $substitute_character = null: 置換文字を指定します。文字列、整数(文字コード)、またはnullを指定できます。nullを指定すると、デフォルトの置換文字が使用されます。

戻り値(return)

string|int|true

mb_substitute_character関数は、マルチバイト文字列の置換文字を設定または取得する機能を提供します。この関数は、現在設定されている置換文字を文字列として返します。指定された引数によって、置換文字の設定に成功した場合はtrue、失敗した場合はfalseを返します。

サンプルコード

mb_substitute_character で代替文字を設定する

1<?php
2
3/**
4 * mb_substitute_character関数の使い方をデモンストレーションします。
5 *
6 * この関数は、mb_convert_encodingなどの多バイト文字列関数で
7 * 文字コード変換時に変換できない文字が出現した場合の代替文字を設定します。
8 * システムエンジニアを目指す初心者の方にも分かりやすいよう、
9 * 現在の設定の取得、文字列での設定、数値参照での設定、
10 * そしてその設定が適用される例を示します。
11 */
12function demonstrateMbSubstituteCharacter(): void
13{
14    echo "mb_substitute_character関数のデモンストレーション:\n\n";
15
16    // 1. 現在の代替文字設定を取得し表示
17    // 引数なしで呼び出すと、現在の代替文字設定が返されます。
18    // 戻り値はstringまたはintの可能性があります。
19    $currentSubstitute = mb_substitute_character();
20    echo "現在の代替文字設定: " . (is_string($currentSubstitute) ? "'{$currentSubstitute}'" : $currentSubstitute) . "\n\n";
21
22    // 2. 代替文字を特定の文字列(例: '?')に設定
23    // 設定変更前に現在の設定を保存しておき、設定後に新しい現在の設定を取得します。
24    // mb_substitute_character()に引数を渡すと、成功時にtrueが返されます。
25    $oldSubstitute = mb_substitute_character(); // 設定前の値を取得
26    mb_substitute_character('?'); // 変換できない文字を '?' に置き換えるように設定
27
28    echo "代替文字を '?' に設定しました。\n";
29    echo "以前の代替文字設定: " . (is_string($oldSubstitute) ? "'{$oldSubstitute}'" : $oldSubstitute) . "\n";
30    $currentSubstitute = mb_substitute_character(); // 新しい現在の設定を取得
31    echo "現在の代替文字設定: " . (is_string($currentSubstitute) ? "'{$currentSubstitute}'" : $currentSubstitute) . "\n\n";
32
33    // 3. 設定した代替文字が機能することを示す
34    // 存在しない文字をUTF-8からEUC-JPに変換する例。
35    // '€' (ユーロ記号) は多くのEUC-JP環境ではサポートされていないため、代替文字に置き換えられます。
36    $textWithUnsupportedChar = "Hello, € World!";
37    $targetEncoding = 'EUC-JP'; // 変換先のエンコーディング
38
39    echo "元の文字列 (UTF-8): '{$textWithUnsupportedChar}'\n";
40    echo "変換先のエンコーディング: {$targetEncoding}\n";
41
42    // mb_internal_encodingを明示的に設定(ここでは変換元のエンコーディングに合わせる)
43    mb_internal_encoding('UTF-8');
44
45    // mb_convert_encoding を使用して文字コード変換
46    $convertedText = mb_convert_encoding($textWithUnsupportedChar, $targetEncoding, 'UTF-8');
47    echo "変換後の文字列: '{$convertedText}'\n\n"; // 変換できない文字が '?' に置き換えられるはず
48
49    // 4. 代替文字をHTMLエンティティの数値参照(例: &#63;)に設定
50    // 数値63はクエスチョンマーク '?' のASCII/Unicode値に対応し、
51    // HTMLエンティティ &#63; として表示されます。
52    $oldSubstitute = mb_substitute_character(); // 設定前の値を取得
53    mb_substitute_character(63); // 変換できない文字を &#63; に置き換えるように設定
54
55    echo "代替文字を &#63; (整数 63) に設定しました。\n";
56    echo "以前の代替文字設定: " . (is_string($oldSubstitute) ? "'{$oldSubstitute}'" : $oldSubstitute) . "\n";
57    $currentSubstitute = mb_substitute_character(); // 新しい現在の設定を取得
58    echo "現在の代替文字設定: " . (is_string($currentSubstitute) ? "'{$currentSubstitute}'" : $currentSubstitute) . "\n\n";
59
60    // 5. 新しい代替文字設定が機能することを示す
61    $convertedTextHtml = mb_convert_encoding($textWithUnsupportedChar, $targetEncoding, 'UTF-8');
62    echo "変換後の文字列 (HTML数値参照): '{$convertedTextHtml}'\n\n"; // 変換できない文字が &#63; に置き換えられるはず
63
64    // 6. 代替文字設定をデフォルトに戻す
65    // nullを引数に渡すと、設定をphp.iniで定義されたデフォルト値(通常は'?'または'&#xFFFD;')に戻します。
66    echo "代替文字設定をデフォルトに戻します。\n";
67    mb_substitute_character(null);
68    $currentSubstitute = mb_substitute_character(); // デフォルト設定を取得
69    echo "現在の代替文字設定: " . (is_string($currentSubstitute) ? "'{$currentSubstitute}'" : $currentSubstitute) . "\n";
70}
71
72// 関数の実行
73demonstrateMbSubstituteCharacter();
74
75?>

mb_substitute_character関数は、PHPの多バイト文字列関数(例えばmb_convert_encodingなど)を使用して文字コードを変換する際に、変換先のエンコーディングでは表現できない文字が出現した場合の「代替文字」を設定したり、現在設定されている代替文字を取得したりするために使用されます。

この関数を引数なしで呼び出すと、現在設定されている代替文字が文字列または整数の形式で返されます。例えば、デフォルト設定のままの場合、クエスチョンマーク '?' が返されることが多いでしょう。代替文字を設定するには、引数に設定したい値を渡します。特定の文字列(例: '?')を渡すと、変換できない文字はその指定した文字に置き換えられるようになります。また、整数の値(例: 63)を渡すと、その数値が示す文字のHTMLエンティティ(例: &#63;)が代替文字として使用されます。設定が成功すると、関数はtrueを返します。

サンプルコードでは、ユーロ記号 '€' のように、ターゲットとなるエンコーディング(例: EUC-JP)でサポートされていない文字を含む文字列を変換する例を通じて、設定した代替文字が実際に適用される様子を示しています。設定が '?' の場合は変換できない文字が '?' に置き換わり、整数 63 の場合は &#63; に置き換わることを確認できます。最後に、引数にnullを渡すことで、代替文字の設定をphp.iniで定義されたデフォルト値に戻すことができます。このように、mb_substitute_character関数は、文字コード変換時の文字化け対応を柔軟に制御する上で重要な役割を果たします。

mb_substitute_character関数は、文字コード変換時に変換できない文字の代替方法を設定します。この設定は、一度行うとスクリプト内のすべてのmb_*関数に影響を与えるため、特定の処理のために一時的に変更した場合は、必ず元の設定に戻すか、nullを引数に渡してデフォルトに戻すようにしてください。引数なしで現在の設定を取得する際、戻り値の型は文字列または整数のいずれかですので、型を確認して適切に扱ってください。特に整数値を代替文字として指定した場合、それはHTML数値参照(&#NNN;形式)として扱われるため、HTML以外の出力で利用する際は意図しない表示になる可能性があります。多バイト文字を正確に処理するにはmb_internal_encodingの適切な設定が不可欠で、この関数を利用するにはPHPのmbstring拡張が有効になっている必要があります。

PHP mb_substitute_character で文字化け置換する

1<?php
2
3/**
4 * mb_substitute_character 関数の使用例を示します。
5 * この関数は、多バイト文字列のエンコーディング変換時に、
6 * 変換先のエンコーディングで表現できない文字が出現した場合に、
7 * その文字を何に置き換えるかを設定するために使用されます。
8 *
9 * キーワード "mb_substr_replace" はPHPに直接対応する関数ではありませんが、
10 * mb_substitute_character は「文字を代替・置換する」という点で関連性があります。
11 * ここでは、エンコーディング変換時に文字を代替する方法として、
12 * この関数の利用例を紹介します。
13 */
14function demonstrateMbSubstituteCharacter(): void
15{
16    // 元の文字列 (UTF-8)。絵文字など、一部のエンコーディングでは表現できない文字を含みます。
17    $originalString = "こんにちは、世界!😄 これはPHPのサンプルです。";
18    echo "元の文字列 (UTF-8): " . $originalString . PHP_EOL . PHP_EOL;
19
20    // 現在の代替文字の設定を保存しておき、後で戻せるようにします。
21    $originalSubstituteChar = mb_substitute_character();
22
23    // --------------------------------------------------------------------
24    // 1. mb_substitute_character を設定しない (またはデフォルトに戻す) 場合
25    //    表現できない文字は通常 '?' や空文字に置き換えられます。
26    // --------------------------------------------------------------------
27    echo "--- (1) 代替文字設定なし (デフォルト)の場合 ---" . PHP_EOL;
28    // 代替文字設定をデフォルト (通常は '?') に戻します。
29    mb_substitute_character(null);
30
31    // UTF-8 から EUC-JP への変換を試みます。EUC-JP では絵文字 '😄' は表現できません。
32    $convertedStringDefault = mb_convert_encoding($originalString, 'EUC-JP', 'UTF-8');
33    echo "EUC-JPへの変換結果 (デフォルト): " . $convertedStringDefault . PHP_EOL;
34    echo "  (絵文字は '?' などに置き換えられています。)" . PHP_EOL . PHP_EOL;
35
36    // --------------------------------------------------------------------
37    // 2. 特定の文字列を代替文字として設定する場合
38    // --------------------------------------------------------------------
39    echo "--- (2) 特定の文字列を代替文字として設定した場合 ---" . PHP_EOL;
40    // 代替文字を '[代替]' に設定します。
41    mb_substitute_character('[代替]');
42
43    $convertedStringCustom = mb_convert_encoding($originalString, 'EUC-JP', 'UTF-8');
44    echo "EUC-JPへの変換結果 ('[代替]'設定時): " . $convertedStringCustom . PHP_EOL;
45    echo "  (絵文字は '[代替]' に置き換えられています。)" . PHP_EOL . PHP_EOL;
46
47    // --------------------------------------------------------------------
48    // 3. 数値エンティティ (HTMLエンティティ) を代替文字として設定する場合
49    //    これはウェブページでの表示に適しています。
50    // --------------------------------------------------------------------
51    echo "--- (3) 数値エンティティを代替文字として設定した場合 ---" . PHP_EOL;
52    // 代替文字を数値エンティティ形式に設定します。
53    // 'entity' という文字列、または定数 MB_SUBSTITUTE_CHARACTER_ENTITY を使用できます。
54    mb_substitute_character('entity');
55
56    $convertedStringEntity = mb_convert_encoding($originalString, 'EUC-JP', 'UTF-8');
57    echo "EUC-JPへの変換結果 (数値エンティティ設定時): " . $convertedStringEntity . PHP_EOL;
58    echo "  (絵文字は &#xXXXX; 形式の数値エンティティに置き換えられています。)" . PHP_EOL . PHP_EOL;
59
60    // 最後に、mb_substitute_character の設定を元の値に戻します。
61    mb_substitute_character($originalSubstituteChar);
62}
63
64// 関数を実行して動作を確認します。
65demonstrateMbSubstituteCharacter();
66
67?>

mb_substitute_character関数は、PHPで多バイト文字列のエンコーディングを変換する際に、変換先のエンコーディングで表現できない文字をどのように扱うかを設定する関数です。この設定により、文字化けを防ぎつつ、代替文字の表示方法を制御できます。

この関数は、引数として代替文字を定義する文字列、文字コードを表す整数、または設定をリセットするnullを受け取ります。特に文字列'entity'または定数MB_SUBSTITUTE_CHARACTER_ENTITYを指定すると、文字を数値エンティティ形式(例: &#xXXXX;)に変換します。引数を省略して呼び出すと、現在の代替文字の設定値(文字列または整数)を返し、設定に成功した場合はtrueを返します。

サンプルコードでは、絵文字を含むUTF-8文字列をEUC-JPに変換する際の挙動を示しています。デフォルト設定(null)の場合、表現できない文字は通常?などに置き換えられます。mb_substitute_character('[代替]')のように特定の文字列を設定すると、表現できない文字はその文字列に置き換えられます。また、mb_substitute_character('entity')と設定すると、ウェブページでの表示に適した数値エンティティ形式に変換されます。

キーワードのmb_substr_replaceは直接の関数ではありませんが、mb_substitute_characterはエンコーディング変換時に文字を「代替・置換する」という点で、機能的に関連性があります。

mb_substitute_character関数は、多バイト文字列のエンコーディング変換時に、変換先のエンコーディングで表現できない文字をどのように置き換えるかを設定するグローバルな機能です。一度この関数で設定を変更すると、その後のすべての多バイト文字列関数(例: mb_convert_encoding)に影響を与えるため注意が必要です。処理を終えたら、サンプルコードのように元の設定を保存し、最後に復元することが安全な利用方法として強く推奨されます。代替文字には特定の文字列を指定できるほか、「entity」を指定することでウェブページでの表示に適したHTML数値エンティティ形式で置き換えることも可能です。この設定を適切に活用することで、文字化けを防ぎ、データの整合性を保つことができます。

関連コンテンツ

関連プログラミング言語