向下看rabbit hole,comments in the documentation for mb_encode_numericentity 似乎是准确的,虽然有些神秘。
convmap 的四个主要部分似乎是:
start_code:地图影响从此字符代码开始的项目。
end_code:地图影响直到此字符代码的项目。
offset:添加特定的偏移量(正或负) 用于此字符代码。
mask:用于掩码操作的值(字符代码按位与掩码值)。
字符代码可以通过字符表进行可视化,例如this Codepage Layout example 用于ISO-8859-1 编码。 (ISO-8859-1 是原始 PHP 文档中使用的编码 Example #2。) 查看此编码表,我们可以看到 convmap 仅用于影响从以下开始的字符代码项0x80(对于这个特定的编码来说似乎是空白)到这个编码中的最后一个字符0xff(似乎是ÿ)。 p>
为了更好地理解 convmap 的 offset 和 mask 特性,这里有一些关于 offset 和 mask 如何影响字符代码的示例(以及在下面的示例中,我们的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";
?>
结果:
original: ¢
converted: ¢
偏移示例:
<?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";
?>
结果:
original: ¢
converted: £
注意事项:
offset 似乎允许对 items-to-convert 的当前 start_code 和 end_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";
?>
结果:
original: ¢
converted:  
original: ¢
converted: 
original: ¢
converted: �
注意事项:
此答案不打算涵盖masking in great detail,但屏蔽可以帮助keep or remove certain bits 从给定的值。
掩码示例 1
所以在第一个掩码示例0xf0 中,f 表示我们希望保留二进制值左侧的值。这里,f 的二进制值是1111,0 的二进制值是0000——一起变成了11110000 的值。
然后,当我们对character code 进行按位与运算时(在本例中为162,其二进制值为10100010)按位运算如下所示:
11110000
& 10100010
----------
10100000
当转换回它的十进制值时,10100000 是160。
因此,我们有效地保留了原始character code 值的位“左侧”,并去掉了位的“右侧”。
掩码示例 2
在第二个掩码示例中,按位与运算中的掩码0x0f(其二进制值为00001111)将具有以下二进制结果:
00001111
& 10100010
----------
00000010
当转换回它的十进制值时,它是2。
因此,我们有效地保留了原始character code 值中的位“右侧”,并消除了位的“左侧”。
掩码示例 3
最后,第三个掩码示例显示了在按位与运算中使用0x00 (二进制为00000000)的掩码会发生什么:
00000000
& 10100010
----------
00000000
这导致0。