Php 更好地解释mb_encode_numericentity()中的$convmap
对于中的方法Php 更好地解释mb_encode_numericentity()中的$convmap,php,collation,html-entities,html-encode,Php,Collation,Html Entities,Html Encode,对于中的方法mb\u encode\u numericentity,对该参数convmap的描述对我来说很模糊。有人能帮我更好地解释这个问题吗?或者,如果这对我来说足够的话,也许可以“让它安静下来”?此参数中使用的数组元素的含义是什么?手册页中的示例1 <?php $convmap = array ( int start_code1, int end_code1, int offset1, int mask1, int start_code2, int end_code2, int o
mb\u encode\u 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
在这种上下文中的含义是什么?向下看,看起来这些字符是准确的,尽管有些神秘
convmap
的四个主要部分似乎是:
start\u code
:地图影响从此字符代码开始的项目。
end\u code
:映射将影响此字符代码之前的项目。
offset
:为此字符代码添加特定的偏移量(正数或负数)。
mask
:用于掩码操作的值(字符代码按位和掩码值)
字符代码可以通过字符表可视化,例如用于ISO-8859-1
编码。(ISO-8859-1
是原始PHP文档中使用的编码。)查看此编码表,我们可以看到convmap
仅用于影响从0x80
开始的字符代码项(对于此特定编码,它似乎为空)此编码中的最后一个字符0xff
(看起来是ÿ
)
为了更好地理解convmap
的偏移量和掩码功能,以下是偏移量和掩码如何影响字符代码的一些示例(在下面的示例中,我们的字符代码
的定义值为162
):
简单的例子:
偏移示例:
笔记:
offset
似乎允许对要转换的项目的当前start\u code
和end\u code
部分进行更精细的控制。例如,您可能有特定的原因需要为convmap
中的某一行字符代码添加偏移量,但随后可能需要忽略convmap
中另一行的偏移量
掩码示例:
笔记:
这个答案并不打算涵盖,但掩蔽可以从给定的值中得到帮助
掩码示例1
因此,在第一个掩码示例中,0xf0
,f
表示我们希望将值保留在二进制值的左侧。这里,f
的二进制值为1111
,0
的二进制值为0000
——一起成为11110000
的值
然后,当我们使用字符代码
(在本例中为162
,其二进制值为10100010
)执行按位AND操作时,按位操作如下所示:
11110000
& 10100010
----------
10100000
当转换回其十进制值时,10100000
为160
因此,我们有效地保留了原始字符代码
值中位的“左侧”,并去掉了位的“右侧”
掩码示例2
在第二个掩码示例中,按位AND操作中的掩码0x0f
(其二进制值为00001111
)将具有以下二进制结果:
00001111
& 10100010
----------
00000010
当转换回十进制值时,它是2
因此,我们有效地保留了原始字符代码
值中位的“右侧”,并去掉了位的“左侧”
遮罩示例3
最后,第三个掩码示例显示了在按位AND操作中使用0x00
(二进制形式为00000000
)掩码时发生的情况:
00000000
& 10100010
----------
00000000
这导致了0
乍一看,这两个页面和该页面上似乎显示了相同的格式(但显示为单行或多行),这意味着偏移量
将为0
,掩码
将为0xffff
。这些示例中的$convmap
似乎表明,您可以根据需要包含任意多的“行”(“四个值的集合”)。@summea感谢summea。在此上下文中,mask
的确切含义是什么?我更新了我的问题。在convmap
中使用offset
和mask
值可能有更具体的原因,但我希望下面的答案能有所帮助!你太棒了。非常感谢:)@NickRolando哦,不是我!但我很高兴这有帮助!
original: ¢
converted: £
<?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:  
original: ¢
converted: 
original: ¢
converted: �
11110000
& 10100010
----------
10100000
00001111
& 10100010
----------
00000010
00000000
& 10100010
----------
00000000