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

时间:2016-03-07 21:36:27

标签: php collation html-entities html-encode

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在此中的含义上下文

1 个答案:

答案 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: &#162;
  

结果:

<?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: &#163; 似乎允许对要转换的项目的当前offsetstart_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来自给定值。

面具示例1

因此,在第一个掩码示例original: ¢ converted: &#160; original: ¢ converted: &#2; original: ¢ converted: &#0; 中,0xf0表示我们希望将值保留在二进制值的左侧。在这里,f的二进制值为f1111的二进制值为0 - 一起变为0000的值。

然后,当我们对11110000 进行按位AND运算时(在这种情况下,character code,其二进制值为162按位运算如下所示:

10100010

当转换回十进制值时, 11110000 & 10100010 ---------- 10100000 10100000

因此,我们有效地保留了原始160值的“左侧”位,并且已经摆脱了位的“右侧”。

面具示例2

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

00001111

当转换回十进制值时, 00001111 & 10100010 ---------- 00000010

因此,我们有效地保留了原始2值的“右侧”位,并且已经摆脱了位的“左侧”。

面具示例3

最后,第三个掩码示例显示了在按位AND操作中使用character code (在二进制中为0x00 的掩码时会发生什么:

00000000

结果为 00000000 & 10100010 ---------- 00000000