Dart中如何正确解码ASCII格式数字字符编码为普通文本
问题原因
dart:convert 包提供的ASCII解码器仅支持解码码位范围0-127的标准ASCII字符,你需要处理的&#XXXX格式内容不属于ASCII编码范畴,本质是HTML十进制数字实体,&#后跟随的数字是对应字符的Unicode十进制码位,因此用ASCII解码器无法完成解码。
实现步骤
- 预处理输入内容:先修复输入里的格式异常,比如示例中出现的
& #(&和#之间多了空格)的错误,统一替换为标准的&#格式,再按规则提取所有实体单元。 - 实体解析:提取每个实体中
&#后、分号前的数字,转换为整数类型的Unicode码位值。 - 字符转换:使用Dart内置的
String.fromCharCode()方法,将每个码位直接转换为对应字符,最后拼接所有字符得到最终解码结果。
可复用实现代码
/// 解码&#XXXX;格式的HTML十进制数字实体为普通文本 String decodeNumericHtmlEntities(String rawInput) { // 修复&与#之间存在多余空格的格式问题 final fixedInput = rawInput.replaceAll(RegExp(r'&\s+#'), '&#'); // 匹配所有合法的数字实体 final entityReg = RegExp(r'&#(\d+);'); // 逐段替换实体为对应字符 return fixedInput.replaceAllMapped(entityReg, (match) { final charCode = int.parse(match.group(1)!); return String.fromCharCode(charCode); }); } // 测试验证 void main() { const testInput = "ف َ إ ِ ن ّ َ   ٱ ل ْ ج& #1614; ن ّ َ ة َ"; final decodeResult = decodeNumericHtmlEntities(testInput); print(decodeResult); // 输出结果:فَإِنَّ ٱلْجَنَّة }
提示:如果你的输入完全符合
&#数字;的标准实体格式,没有多余空格、缺分号之类的问题,可以跳过预处理的替换步骤,直接执行正则匹配替换即可。
内容的提问来源于stack exchange,提问作者Shamsudeen McHalwai
相关产品推荐
相关产品推荐

