mb_encode_numericentity 用于将字符串中符合指定范围的字符编码成数值实体(numeric entity)格式。数值实体格式类似于 HTML 中的 &#xxxx;,其中 xxxx 是字符对应的 Unicode 码点。
函数原型:
string mb_encode_numericentity(string $str, array $convmap, string $encoding = mb_internal_encoding(), bool $is_hex = false)
$str:待编码的字符串。
$convmap:转换映射数组,用于指定哪些字符范围需要编码。格式是四个整数一组,分别表示起始码点、结束码点、偏移值和编码值。
$encoding:字符串编码,默认为内部编码。
$is_hex:如果设为 true,则数值实体用十六进制表示。
mb_decode_numericentity 用于将数值实体格式的字符串转换回原始的多字节字符串。
函数原型:
string mb_decode_numericentity(string $str, array $convmap, string $encoding = mb_internal_encoding())
$str:待解码的字符串。
$convmap:转换映射数组,作用同 mb_encode_numericentity。
$encoding:字符串编码。
假设我们需要对一段包含中文的字符串进行编码,编码后将所有中文字符转成数值实体,然后再解码还原成原始字符串。
<?php
// 定义转换映射,覆盖常用的汉字字符编码范围
$convmap = [0x4E00, 0x9FFF, 0, 0xFFFF];
// 待编码字符串
$str = "你好,世界!Hello World!";
// 编码,将汉字转成数值实体
$encoded = mb_encode_numericentity($str, $convmap, "UTF-8");
echo "编码后:\n" . $encoded . "\n";
// 解码,将数值实体还原回汉字
$decoded = mb_decode_numericentity($encoded, $convmap, "UTF-8");
echo "解码后:\n" . $decoded . "\n";
?>
运行结果:
编码后:
你好,世界!Hello World!
解码后:
你好,世界!Hello World!
有时候我们需要对 URL 中带有多字节字符的部分进行编码,确保传输过程安全且符合规范。这里展示一个简易的例子,对 URL 中的路径部分使用数值实体编码,再解码回来。
<?php
$convmap = [0x4E00, 0x9FFF, 0, 0xFFFF];
$url = "https://gitbox.net/路径/测试";
// 只对路径部分编码
$parsed = parse_url($url);
$encoded_path = mb_encode_numericentity(urldecode($parsed['path']), $convmap, "UTF-8");
// 拼接编码后的 URL
$encoded_url = $parsed['scheme'] . "://" . $parsed['host'] . $encoded_path;
echo "编码后的 URL:\n" . $encoded_url . "\n";
// 解码路径
$decoded_path = mb_decode_numericentity($encoded_path, $convmap, "UTF-8");
// 还原完整 URL
$decoded_url = $parsed['scheme'] . "://" . $parsed['host'] . $decoded_path;
echo "解码后的 URL:\n" . $decoded_url . "\n";
?>
输出:
编码后的 URL:
https://gitbox.net/车路/测试
解码后的 URL:
https://gitbox.net/路径/测试
mb_encode_numericentity 可以将字符串中指定范围内的字符转换成数值实体编码,有效保护多字节字符在传输或存储时不被破坏。
mb_decode_numericentity 负责把编码后的数值实体还原回对应的多字节字符。
这两个函数配合使用,在多语言环境下处理字符串编码问题时非常方便,尤其适合处理带有特殊字符的 URL 或需要安全传输的文本数据。
掌握这两个函数,可以大大提升多字节字符串处理的灵活性和安全性。