gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:02:37 24 4
gpt4 key购买 nike

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 在这种情况下是什么意思?

最佳答案

往下看rabbit hole , 看来 comments in the documentation for mb_encode_numericentity是准确的,尽管有些含糊。

The four major parts to the convmap appear to be:

start_code: The map affects items starting from this character code.
end_code: The map affects items up to this character code.
offset: Add a specific offset amount (positive or negative) for this character code.
mask: Value to be used for mask operation (character code bitwise AND mask value).

字符代码可以通过字符表可视化,例如 this Codepage Layout example用于 ISO-8859-1 编码。 (ISO-8859-1 是原始 PHP 文档中使用的编码 Example #2 。) 查看此编码表,我们可以看到 convmap 仅用于影响从 0x80 (对于此特定编码显示为空白) 到此编码 中的最后一个字符的字符代码项0xff (看起来是 ÿ)

为了更好的理解convmapoffsetma​​sk特性,这里举例说明offset和mask对字符编码的影响< em>(在下面的示例中,我们的 字符代码 的定义值为 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: &#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";
?>

Result:

original:  ¢
converted: &#163;

注意事项:

offset 似乎允许对要转换的项目的当前 start_codeend_code 部分进行更精细的控制。例如,您可能有一些特殊原因需要为 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";
?>

Result:

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 的值。

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

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

当转换回其十进制值时,10100000160

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

掩码示例 2

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

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

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

因此,我们有效地保留了原始字符代码值中位的“右侧”,并去掉了位的“左侧”。

掩码示例 3

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

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

结果为 0

关于php - 在 mb_encode_numericentity() 中更好地解释 $convmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35854535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com