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

如何剥离UTF-8中的4字节字符?仅支持UTF8mb3的实现方法

剥离UTF-8中的4字节字符(仅支持UTF8mb3)

UTF8mb3 对应 Unicode 码点范围 U+0000 到 U+FFFF,而4字节UTF-8字符对应 U+10000 及以上的码点。以下是不同场景下的实现方法:

Python 实现

方法1:正则表达式替换

直接匹配所有4字节UTF-8对应的码点范围并删除:

import re

def strip_4byte_utf8(text):
    # 匹配U+10000到U+10FFFF的字符
    return re.sub(r'[\U00010000-\U0010FFFF]', '', text)

方法2:遍历字符过滤

通过判断字符的Unicode码点是否超过0xFFFF来过滤:

def strip_4byte_utf8(text):
    return ''.join([c for c in text if ord(c) <= 0xFFFF])

PHP 实现

利用PCRE的UTF-8模式匹配码点范围:

function strip_4byte_utf8($str) {
    // u模式开启UTF-8匹配
    return preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);
}

命令行工具处理(Linux/macOS)

sed 字节匹配

4字节UTF-8的首字节范围是 0xF0 到 0xF7,后续三个字节都是 0x80 到 0xBF,直接匹配并删除该序列:

sed 's/\xF0[\x80-\xBF][\x80-\xBF][\x80-\xBF]//g' input.txt > output.txt

gawk 字符码点过滤

借助gawk的UTF-8支持,判断字符码点是否超出范围:

gawk 'BEGIN{FPAT="."} {
    for(i=1;i<=NF;i++) {
        if(ord($i) <= 0xFFFF) printf $i
    }
    print ""
}' input.txt > output.txt

MySQL 数据库处理

如果需要将数据库中存储的UTF8mb4数据转换为UTF8mb3,先过滤4字节字符再转换:

-- 过滤字段中的4字节字符
UPDATE your_table 
SET your_column = REGEXP_REPLACE(your_column, '[\\x{10000}-\\x{10FFFF}]', '');

-- 转换字段编码为UTF8mb3(需确保无剩余4字节字符)
ALTER TABLE your_table MODIFY COLUMN your_column VARCHAR(255) CHARACTER SET utf8mb3;

注意事项

  • 若处理的是不完整的UTF-8字节序列(如截断的4字节字符),正则或字节匹配可能需要额外的校验逻辑。
  • 所有方法的核心逻辑都是过滤Unicode码点大于0xFFFF的字符,因为这是UTF8mb3的最大支持范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:43:26