php manual中方法convmap
对此参数mb_encode_numericentity
的说明对我来说很模糊。有人会帮助更好地解释这个问题,或者可能会愚蠢地解决这个问题。如果它对我来说应该足够了?这个参数中使用的数组元素的含义是什么?联机帮助页中的示例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.
?>
这是有帮助的,但后来我看到很多用法示例,例如array(0x80, 0xffff, 0, 0xffff);
,它会让我失望。这是否意味着偏移量为0
,掩码为0xffff
,如果是,则会偏移字符串中要开始转换的平均字符数,以及mask
在此中的含义上下文
答案 0 :(得分:4)
向下看rabbit hole,看来comments in the documentation for mb_encode_numericentity
是准确的,但有点神秘。
convmap
的四个主要部分似乎是:
start_code
:地图会影响从此字符代码开始的项目end_code
:地图会影响此字符代码以外的项目offset
:为此字符代码添加特定的偏移金额(正面或负面)mask
:用于掩码操作的值(字符代码按位AND 掩码值)。
字符代码可以通过this Codepage Layout example等字符表进行ISO-8859-1
编码。 (ISO-8859-1
是原始PHP文档Example #2中使用的编码。)查看此编码表,我们可以看到convmap
仅用于影响从0x80
开始的字符代码项(此特定编码似乎为空白)到此编码中的最终字符0xff
(似乎为{ {1}})
为了更好地理解ÿ
的偏移和掩码功能,以下是偏移和掩码如何影响字符代码的一些示例(在下面的示例中,我们的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"; ?>
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
和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"; ?>
此答案不打算涵盖masking in great detail,但屏蔽可以帮助keep or remove certain bits来自给定值。
因此,在第一个掩码示例original: ¢
converted:  
original: ¢
converted: 
original: ¢
converted: �
中,0xf0
表示我们希望将值保留在二进制值的左侧。在这里,f
的二进制值为f
,1111
的二进制值为0
- 一起变为0000
的值。
然后,当我们对11110000
进行按位AND运算时(在这种情况下,character code
,其二进制值为162
)按位运算如下所示:
10100010
当转换回十进制值时, 11110000
& 10100010
----------
10100000
为10100000
。
因此,我们有效地保留了原始160
值的“左侧”位,并且已经摆脱了位的“右侧”。
在第二个掩码示例中,按位AND运算中的掩码character code
(其二进制值为0x0f
)将具有以下二进制结果:
00001111
当转换回十进制值时, 00001111
& 10100010
----------
00000010
。
因此,我们有效地保留了原始2
值的“右侧”位,并且已经摆脱了位的“左侧”。
最后,第三个掩码示例显示了在按位AND操作中使用character code
(在二进制中为0x00
的掩码时会发生什么:
00000000
结果为 00000000
& 10100010
----------
00000000
。