看着兔子洞, 似乎mb_encode_numericentity
文档中的评论是准确的,尽管有些晦涩。
convmap
的四个主要部分似乎是:
start_code
: 映射从此字符代码开始的项目。
end_code
: 映射影响到此字符代码之前的项目。
offset
: 为此字符代码添加特定偏移量(正或负)。
mask
: 用于掩码操作的值(字符代码按位与掩码值)。
字符编码可以通过字符表进行可视化,例如
this Codepage Layout example,适用于
ISO-8859-1
编码。在这个编码表中,我们可以看到
convmap
只会影响从
0x80
开始的字符编码项(对于这种特定编码似乎为空白)直到该编码的最后一个字符
0xff
(似乎是
ÿ
)。
(ISO-8859-1
是 PHP 文档 Example #2 中使用的编码)。
为了更好地理解
convmap
的
偏移量(offset)和
掩码(mask)功能,以下是一些示例,展示了偏移量和掩码如何影响字符编码
(在下面的示例中,我们的字符编码
具有定义值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";
?>
Result:
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";
?>
Result:
original: ¢
converted: &
注意:
offset
看起来可以更精细地控制当前要转换的项目的 start_code
和 end_code
部分。例如,您可能有某些特定的原因需要为您的 convmap
中的某些字符代码行添加偏移量,但是您可能需要忽略另一行中的该偏移量。
口罩示例:
<?php
$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";
$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";
$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";
?>
Result:
original: ¢
converted:  
original: ¢
converted: 
original: ¢
converted: �
注意:
本回答不打算详细介绍掩码,但掩码可以帮助保留或删除给定值的某些位。
掩码示例1
因此,在第一个掩码示例中,0xf0
中的f
表示我们要保留二进制值左侧的值。在这里,f
的二进制值为1111
,而0
的二进制值为0000
——两者合在一起变成了11110000
的值。
然后,当我们对字符代码
(在这种情况下,是162
,其二进制值为10100010
)进行按位AND操作时,按位运算如下:
11110000
& 10100010
10100000
当转换回十进制值时,10100000
是 160
。
因此,我们有效地保留了原始字符编码值的“左侧”比特,并且摆脱了比特的“右侧”。
掩码示例2
在第二个掩码示例中,掩码0x0f
(其二进制值为00001111
)在按位与操作中将具有以下二进制结果:
00001111
& 10100010
00000010
将其转换回十进制值后,结果为2
。
因此,我们有效地保留了原始字符编码
值的“右侧”位,并且摆脱了“左侧”位。
掩码示例3
最后,第三个掩码示例展示了在位与操作中使用0x00
掩码的情况 (它在二进制中表示为00000000
):
00000000
& 10100010
----------
00000000
这导致结果为
0
。
$convmap
表明,您可以包括任意数量的“行”(四个值的“集合”)。 - summeaconvmap
中使用offset
和mask
值可能有更具体的原因,但我希望下面的答案能稍微帮到你! - summea