You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

兼容现有PHP方案:Emoji转UTF-8 &#x格式编码需求

如何将Emoji转换为&#xHH;格式的十六进制字符实体引用(附PHP实现)

我来帮你理清这个问题——你说的😁其实是HTML十六进制字符实体引用,属于HTML实体的一种变体,专门用来把单个字节的十六进制值转换成HTML可识别的实体格式。下面给你详细拆解:

一、这个编码的定义与适用场景

这种格式本质是把UTF-8编码的每个字节单独转换成&#x[十六进制值];的形式:

  • 因为Emoji(比如😁)是4字节的UTF-8字符,所以会被拆成4个独立的实体片段
  • 适用场景:
    • 兼容不支持直接存储/解析多字节UTF-8字符的旧PHP系统或数据库字段,避免乱码
    • 在一些早期模板引擎或文本处理场景中,防止特殊字符被误解析
    • 确保跨环境的字符显示一致性,尤其是在对UTF-8支持不完善的系统中

二、PHP实现方法

你已经知道用urlencode("😁")能得到%F0%9F%98%81,这其实就是UTF-8字节的URL编码格式,我们可以基于这个快速转换,或者直接处理字节实现:

方法1:基于urlencode的快速转换

利用urlencode的输出结果,替换前缀并补全实体后缀即可:

function emojiToHexEntities(string $emoji): string {
    $urlEncoded = urlencode($emoji);
    // 将%替换为&#x,最后给每个字节补全;
    return str_replace('%', '&#x', $urlEncoded) . ';';
}

// 测试调用
echo emojiToHexEntities("😁"); // 输出:😁

方法2:直接处理UTF-8字节(更底层)

如果想更直观地操作字节,可以拆分Emoji的UTF-8字节,逐个转换为十六进制实体:

function emojiToHexEntities(string $emoji): string {
    // 把字符串拆成单个UTF-8字节
    $bytes = unpack('C*', $emoji);
    $entities = [];
    foreach ($bytes as $byte) {
        // 把字节转成大写十六进制,拼接成实体格式
        $entities[] = '&#x' . strtoupper(dechex($byte)) . ';';
    }
    return implode('', $entities);
}

// 测试调用
echo emojiToHexEntities("😁"); // 输出:😁

补充说明

  • 反向转换的话,只需要把&#xHH;格式的实体替换回对应的字节,再组合成UTF-8字符串即可
  • 这种方式不仅适用于Emoji,任何UTF-8字符都可以用同样的逻辑转换成字节级的HTML实体引用

内容的提问来源于stack exchange,提问作者1owk3y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:40:17