現在の位置: ホーム> 最新記事一覧> mb_decode_numericalentity関数の範囲配列を正しく設定する方法

mb_decode_numericalentity関数の範囲配列を正しく設定する方法

gitbox 2025-05-29

PHPでは、 MB_DECODE_NUMERICALENTITY関数を使用して、文字列内の数値エンティティを対応する文字に変換します。これは、HTMLエンティティを含むテキストを変換するなど、マルチバイト文字エンコードを扱う場合に非常に便利です。範囲配列を正しく設定することは、関数が適切に機能することを保証するための鍵です。


1。MB_DECODE_NUMERICALENTITY関数の紹介

string mb_decode_numericentity ( string $string , array $map , string $encoding = mb_internal_encoding() )
  • $文字列:変換する文字列。

  • $ MAP :範囲配列、数値エンティティの変換範囲とオフセットの定義。

  • $エンコーディング:文字エンコード、デフォルトで内部エンコード。


2。範囲配列のフォーマットとルール$マップ

範囲配列は1次元配列であり、その長さは4の倍数でなければなりません。4つの要素はそれぞれ変換範囲を表します。

 [
    start_codepoint, end_codepoint, offset, mask,
    start_codepoint, end_codepoint, offset, mask,
    ...
]
  • start_codepoint :Unicode Code Point(小数)を開始します。

  • end_codepoint :end unicode code point(decimal)。

  • オフセット:数値エンティティ値に適用されるオフセット(通常0)。

  • マスク:マスク、ビット操作に使用されます。通常0xffffまたは0xffffffff。

注: mb_decode_numericalityは、数値エンティティコードポイントがstart_codepointからend_codepoint範囲内にある文字のみを変換します。


3。例:範囲配列を正しく設定します

変換したい数値エンティティで覆われているユニコード範囲が、基本的なMultitext平面(BMP)、つまり0x0〜0xffffです。

 $map = [
    0x0, 0xFFFF, 0, 0xFFFF
];

これが説明です:

  • すべてのユニコードコードポイントに対して、数値エンティティを0から65535に変換します。

  • オフセット0は、元の数値エンティティコードポイントが調整されていないことを意味します。

  • マスク0xffffは、変換結果が16ビット範囲に制限されるようにするために使用されます。


4.完全なコードの例

<?php
// 変換する文字列,数値エンティティが含まれています
$input = "Hello &#20320;&#22909;!"; // “Hello こんにちは!”

// 変換範囲配列を設定します,変換するBMPスコープのエンティティ
$map = [0x0, 0xFFFF, 0, 0xFFFF];

// 使用mb_decode_numericentity変換する
$output = mb_decode_numericentity($input, $map, 'UTF-8');

echo $output;  // 出力:Hello こんにちは!
?>

5。注意すべきこと

  1. 範囲配列は4の倍数である必要があります。そうしないと、関数が無効になります。

  2. オフセットは、特に必要でない限り、通常は0に設定されます。

  3. マスクは通常、ユニコード範囲に応じて、 0xffff (16ビット)または0xffffffff (32ビット)です。

  4. 数値エンティティが範囲外である場合、関数はそれを変換しません。


6。概要

  • MB_DECODE_NUMERICALENTITYの範囲配列は、どの数値エンティティが変換されるかを決定します。

  • ターゲット文字を正しく解析できるように、合理的な開始および終了コードポイントとマスクを設定します。

  • ほとんどの通常のシーンでは、 [0x0、0xffff、0、0xfff]を設定して、BMP範囲の文字変換を満たします。

範囲配列設定をマスターすると、さまざまなマルチバイトエンコードされた文字エンティティを柔軟に処理し、文字化けコードと解析エラーを回避できます。