当前位置: 首页> 最新文章列表> 如何利用 mb_encode_numericentity 和 mb_decode_numericentity 实现数据编码与解码?

如何利用 mb_encode_numericentity 和 mb_decode_numericentity 实现数据编码与解码?

gitbox 2025-06-10

1. mb_encode_numericentity 函数简介

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,则数值实体用十六进制表示。


2. mb_decode_numericentity 函数简介

mb_decode_numericentity 用于将数值实体格式的字符串转换回原始的多字节字符串。

函数原型:

string mb_decode_numericentity(string $str, array $convmap, string $encoding = mb_internal_encoding())
  • $str:待解码的字符串。

  • $convmap:转换映射数组,作用同 mb_encode_numericentity

  • $encoding:字符串编码。


3. 实际示例:对中文字符进行编码和解码

假设我们需要对一段包含中文的字符串进行编码,编码后将所有中文字符转成数值实体,然后再解码还原成原始字符串。

<?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";
?>

运行结果:

编码后:
&#20320;&#22909;,&#19990;&#30028;!Hello World!
解码后:
你好,世界!Hello World!

4. 结合 URL 应用场景

有时候我们需要对 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/&#36710;&#x8def;/&#27979;&#35797;
解码后的 URL:
https://gitbox.net/路径/测试

5. 总结

  • mb_encode_numericentity 可以将字符串中指定范围内的字符转换成数值实体编码,有效保护多字节字符在传输或存储时不被破坏。

  • mb_decode_numericentity 负责把编码后的数值实体还原回对应的多字节字符。

  • 这两个函数配合使用,在多语言环境下处理字符串编码问题时非常方便,尤其适合处理带有特殊字符的 URL 或需要安全传输的文本数据。

掌握这两个函数,可以大大提升多字节字符串处理的灵活性和安全性。