【问题标题】:Better explanation of $convmap in mb_encode_numericentity()在 mb_encode_numericentity() 中更好地解释 $convmap
【发布时间】:2016-06-21 15:22:16
【问题描述】:

php manual 中的方法mb_encode_numericentity 对该参数convmap 的描述对我来说是模糊的。有人会帮助更好地解释这一点,或者如果它对我来说足够了,也许会“把它弄糊涂”?这个参数中使用的数组元素是什么意思?手册页中的示例 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 在这种情况下是什么意思?

【问题讨论】:

  • 乍一看,该页面上的Example #1Example #2 似乎都显示相同的格式(但显示为单行或多行) ,这意味着在您的示例中,offset 将是 0 并且 mask 将是 0xffff。这些示例中的$convmap 似乎表明您可以根据需要包含尽可能多的“行”(四个值的“集合”)
  • @summea 谢谢summea。在这种情况下,mask 到底是什么意思?我为此更新了我的问题。
  • convmap 中使用offsetmask 值可能有更具体的原因,但我希望下面的答案对您有所帮助!

标签: php collation html-entities html-encode


【解决方案1】:

向下看rabbit holecomments 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>

为了更好地理解 convmapoffsetma​​sk 特性,这里有一些关于 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: &#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;

注意事项:

offset 似乎允许对 items-to-convert 的当前 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";
?>

结果:

original:  ¢
converted: &#160;

original:  ¢
converted: &#2;

original:  ¢
converted: &#0;

注意事项:

此答案不打算涵盖masking in great detail,但屏蔽可以帮助keep or remove certain bits 从给定的值。

掩码示例 1

所以在第一个掩码示例0xf0 中,f 表示我们希望保留二进制值左侧的值。这里,f 的二进制值是11110 的二进制值是0000——一起变成了11110000 的值。

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

  11110000
& 10100010
----------
  10100000

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

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

掩码示例 2

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

  00001111
& 10100010
----------
  00000010

当转换回它的十进制值时,它是2

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

掩码示例 3

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

  00000000
& 10100010
----------
  00000000

这导致0

【讨论】:

  • 你太棒了。非常感谢:)
  • @NickRolando 哦,不是我!但我很高兴这有帮助!
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 2012-01-28
  • 2021-08-13
  • 2012-02-07
  • 2013-01-05
  • 2011-12-08
  • 2010-09-27
相关资源
最近更新 更多