如何剥离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
相关产品推荐
相关产品推荐

