マルチバイトエンコーディング(UTF-8、GBKなど)を扱う場合、特に文字列操作や傍受を実行する場合、しばしば文字化けされたまたは切り捨てられた問題に遭遇します。 PHPはこれらの問題に対処するためのいくつかの機能を提供し、 MB_Substitute_Characterは非常に便利なツールです。この記事では、弦楽器の切り捨てや文字化けの問題を避けるために、 mb_substitute_characterを使用する方法を紹介します。
MB_SUBSTITETITE_CHARACTERは、PHPマルチバイトストリングエクステンション(MBSTring)の関数です。その主な機能は、マルチバイト文字列操作中に遭遇する無効または違法なキャラクターを置き換えるための代替文字を指定することです。このように、入力文字列に認識されていない文字があったとしても、違法な文字に遭遇するため、プログラムがコードをクラッシュまたは出力しないようにします。
<span><span><span class="hljs-title function_ invoke__">mb_substitute_character</span></span><span>([</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$substitute_char</span></span><span> = MB_SUBSTITUTE_CHARACTER]);
</span></span>
$ soltive_char :代替文字の指定、文字エンコードの整数値になるか、定数mb_substitute_characterを使用できます。デフォルト値はMB_SUBSTITETITE_CHARACTERです。これは、デフォルトの代替文字(通常は疑問符 "?")を意味します。
キャラクター傍受( MB_Substr )や文字検索( MB_STRPOS )などのマルチバイト文字列を操作する場合、文字の境界が正しく処理されない場合、文字化された文字の切り捨てが発生する可能性があります。これは、すべての文字が同じ数のバイトを占めるわけではないためです。正しい数のバイト数に従ってインターセプトまたは操作が実行されない場合、文字の一部が誤って遮断され、その結果、文字化けされたコードが得られます。
文字列を処理する際に文字化けや切り捨てられた問題がないことを確認するには、 MB_Substitute_Characterを使用して代替キャラクターを設定できます。このようにして、プログラムは実行を続けることができるだけでなく、出力文字列もよりフレンドリーになり、直接クラッシュや文字化けのディスプレイを避けます。
<span><span><span class="hljs-comment">// 別の文字を疑問符に設定します“?”</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mb_substitute_character</span></span><span>(<span class="hljs-string">'?");
// サンプル文字列
$string = "Hello, こんにちは,世界!";
// 使用するとします gbk エンコードされた文字列,マルチバイトインターセプトを実行します
echo mb_substr($string, 0, 10, '</span>GBK<span class="hljs-string">');
</span></span></span>
このコードでは、文字列を正しく処理できない場合、システムはエラーをスローしたり、文字めた文字を直接表示したりする代わりに、疑問符(「?」)を使用します。
代替文字の整数値を使用して、表示された代替文字をさらに制御することもできます。たとえば、Unicodeエンコード「?」を使用します。違法なキャラクターの代わりにキャラクター。
<span><span><span class="hljs-comment">// 代替文字をに設定しますUnicodeエンコード“?”(U+FFFD)</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mb_substitute_character</span></span><span>(</span><span><span class="hljs-number">0xFFFD</span></span><span>);
</span><span><span class="hljs-comment">// サンプル文字列</span></span><span>
</span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"Hello, こんにちは,world!"</span></span><span>;
</span><span><span class="hljs-comment">// 使用 UTF-8 インターセプトのエンコード</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mb_substr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span></span>
この例では、違法または認識されていないキャラクターが「?」に置き換えられます。シンボル、プログラムが処理できないキャラクターに遭遇した場合でも、プログラムが優雅に実行され続けることができます。
マルチバイト文字列を傍受する場合、 MB_SUBSTR関数をMB_SUBSTITETITE_CHARACTERと組み合わせて使用して、不適切な傍受位置によるキャラクターの切り捨てを避けることができます。
<span><span><span class="hljs-comment">// 代替文字の設定</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mb_substitute_character</span></span><span>(</span><span><span class="hljs-string">'?'</span></span><span>);
</span><span><span class="hljs-comment">// マルチバイト文字を含む文字列があるとします</span></span><span>
</span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"これはテストテキストです"</span></span><span>;
</span><span><span class="hljs-comment">// 最初の10文字を傍受します</span></span><span>
</span><span><span class="hljs-variable">$sub_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_substr</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$sub_string</span></span><span>; </span><span><span class="hljs-comment">// 出力 “これはテストです”</span></span><span>
</span></span>
通常のsubsts関数を直接使用して文字列を傍受すると、文字化けしたコードの問題に遭遇する可能性があります。この状況は、 MB_SUBSTRと適切な代替キャラクターの設定後に回避できます。
キャラクターエンコード変換を実行すると、互換性のない文字が遭遇する可能性があります。現時点では、 mb_substitute_characterを使用して、変換された文字列が文字化けコードを生成しないことを確認することもできます。
<span><span><span class="hljs-comment">// 代替文字の設定</span></span><span>
</span><span><span class="hljs-title function_ invoke__">mb_substitute_character</span></span><span>(</span><span><span class="hljs-string">'?'</span></span><span>);
</span><span><span class="hljs-comment">// 転送したいとしますUTF-8文字列をに変換しますGBK</span></span><span>
</span><span><span class="hljs-variable">$string</span></span><span> = </span><span><span class="hljs-string">"これは一部ですUTF-8エンコードされた文字列"</span></span><span>;
</span><span><span class="hljs-variable">$converted_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$string</span></span><span>, </span><span><span class="hljs-string">'GBK'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$converted_string</span></span><span>;
</span></span>
代替文字を設定することにより、変換プロセス中に変換できない文字が遭遇したとしても、変換プロセス全体が影響を受けません。
MB_Substitute_Characterは、ひもの切り捨てや文字化けの問題を効果的に回避できる非常に実用的な機能です。マルチバイト文字列操作を実行する場合、 MB_Substitute_Characterを正しく使用すると、コードの堅牢性が向上するだけでなく、違法な文字に遭遇してよりフレンドリーな代替キャラクターに出力したときにプログラムがクラッシュしないようにします。キャラクターの傍受、変換のエンコード、文字検索のいずれであっても、 MB_SUBSTITETITE_CHARACTERは、文字化けされたコードと切り捨ての問題を解決するための重要なツールです。