更好地解释 mb_encode_numericentity() 中的 $convmap

Nic*_*ndo 6 php html-encode collation html-entities

给这个参数的描述中,convmap为方法mb_encode_numericentityPHP手册是含糊我。有人会帮助更好地解释这一点,或者如果它对我来说足够了,也许可以“把它放倒”?这个参数中使用的数组元素是什么意思?联机帮助页中的示例 1 具有

<?php
$convmap = array (
 int start_code1, int end_code1, int offset1, int mask1,
 int start_code2, int end_code2, int offset2, int mask2,
 ........
 int start_codeN, int end_codeN, int offsetN, int maskN );
// Specify Unicode value for start_codeN and end_codeN
// Add offsetN to value and take bit-wise 'AND' with maskN, then
// it converts value to numeric string reference.
?>
Run Code Online (Sandbox Code Playgroud)

这是有帮助的,但后来我看到了很多使用示例,例如array(0x80, 0xffff, 0, 0xffff);让我失望。这是否意味着偏移量0和掩码将是0xffff,如果是这样,偏移量是否意味着开始转换的字符串中的字符数,mask在这种情况下是什么意思?

sum*_*mea 8

低头看兔子洞,似乎文档mb_encode_numericentity中的注释是准确的,尽管有些神秘。

四个主要部分convmap似乎是:

start_code:地图影响从此字符代码开始的项目。
end_code:地图影响到此字符代码的项目。
offset:为此字符代码添加特定的偏移量(正或负)
mask:用于掩码操作的值(字符代码按位与掩码值)

字符代码可以通过字符表进行可视化,例如用于ISO-8859-1编码的代码页布局示例ISO-8859-1是原始 PHP 文档示例 #2 中使用的编码。)查看此编码表,我们可以看到它convmap仅用于影响从0x80 (对于此特定编码似乎为空白)到此编码中的最后一个字符0xff (似乎是ÿ

为了更好地理解 的偏移量掩码特性convmap,以下是偏移量和掩码如何影响字符代码的一些示例(在下面的示例中,我们character code定义了 的值162

简单示例:

<?php    
$original_str = "¢";
$convmap = array(0x00, 0xff, 0, 0xff);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n";
?>
Run Code Online (Sandbox Code Playgroud)

结果:

original:  ¢
converted: &#162;
Run Code Online (Sandbox Code Playgroud)

偏移示例:

<?php
$original_str = "¢";
$convmap = array(0x00, 0xff, 1, 0xff);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n";
?>
Run Code Online (Sandbox Code Playgroud)

结果:

original:  ¢
converted: &#163;
Run Code Online (Sandbox Code Playgroud)

笔记:

offset似乎允许对要转换的项目的当前start_codeend_code部分进行更精细的控制。例如,你可能有你需要添加一个偏移量的字符代码在你一定行的一些特别的原因convmap,但你可能需要忽略对你的另一行偏移convmap


面具示例:

<?php
// Mask Example 1
$original_str = "¢";
$convmap = array(0x00, 0xff, 0, 0xf0);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n\n";

// Mask Example 2
$convmap = array(0x00, 0xff, 0, 0x0f);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n\n";

// Mask Example 3
$convmap = array(0x00, 0xff, 0, 0x00);
$converted_str = mb_encode_numericentity($original_str, $convmap, "UTF-8");
echo "original:  $original_str\n";
echo "converted: $converted_str\n";
?>
Run Code Online (Sandbox Code Playgroud)

结果:

original:  ¢
converted: &#160;

original:  ¢
converted: &#2;

original:  ¢
converted: &#0;
Run Code Online (Sandbox Code Playgroud)

笔记:

这个答案并不打算详细介绍掩码,但掩码可以帮助保留或删除给定值中的某些位

掩码示例 1

所以在第一个掩码示例中0xf0f表示我们希望保留二进制值左侧的值。此处,f具有二进制值1111并且0具有二进制值0000--together 变为值11110000

然后,当我们对我们的character code (在本例中为162,其二进制值为10100010进行按位与运算时,按位运算如下所示:

  11110000
& 10100010
----------
  10100000
Run Code Online (Sandbox Code Playgroud)

当转换回它的十进制值时,10100000160.

因此,我们有效地保留了位的“左侧”与原始character code值,并去除了位的“右侧”。

掩码示例 2

在第二个掩码示例中,按位 AND 运算中的掩码0x0f (其二进制值为00001111将具有以下二进制结果:

  00001111
& 10100010
----------
  00000010
Run Code Online (Sandbox Code Playgroud)

其中,当转换回其十进制值时,是2.

因此,我们有效地保留了位的“右侧”与原始character code值,并摆脱了位的“左侧”。

掩码示例 3

最后,第三个掩码示例显示了在按位 AND 运算中使用的掩码0x00 00000000二进制)时会发生什么:

  00000000
& 10100010
----------
  00000000
Run Code Online (Sandbox Code Playgroud)

这导致0.