Flutter for OpenHarmony:html_unescape 安全解码 HTML 实体字符,从网页抓取数据到友好展示(文本转义处理) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:html_unescape 安全解码 HTML 实体字符,从网页抓取数据到友好展示(文本转义处理) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

前言

当我们从网页抓取数据(爬虫),或者接收富文本编辑器生成的后端接口时,常常会遇到像 <'  这样的 HTML 实体字符。如果直接显示在 UI 上,不仅丑陋,而且难以阅读。

html_unescape 是一个专为 Dart 设计的小型库,它能快速、准确地将这些编码后的实体字符还原为原始文本(如 <'、空格),兼容所有 HTML5 标准实体。

一、概念介绍/原理解析

1.1 基础概念

  • HTML Entity: 为了在 HTML 中显示保留字符(如 <),必须使用转义序列(&...;)。
  • Decoded Text: 还原后的字符,直接供人类阅读。
  • Named Entity: 如 &copy; -> ©
  • Numeric Entity: 如 &#169; -> ©

调用 HtmlUnescape

解码渲染

"Hello" & World (编码串)

核心解析逻辑

Hello & World (还原文本)

&😀 (数字实体)

😀 (表情符号)

1.2 进阶概念

虽然 flutter_html 等渲染库也能处理,但它主要用于渲染整个 HTML。若只需处理单行文本(如新闻标题),html_unescape 更轻量。

二、核心 API/组件详解

2.1 基础用法

最简单的字符串解码。

import'package:html_unescape/html_unescape.dart';voidmain(){final unescape =HtmlUnescape();// 基础符号print(unescape.convert('Flutter &amp; Dart: The &quot;Secret&quot; to 100% OHOS Fix!'));// 中文乱码修复 (如果是以实体形式存在)print(unescape.convert('&#20013;&#25991;'));// 输出: 中文}
在这里插入图片描述

2.2 小技巧

由于创建 HtmlUnescape 对象需要加载映射表(虽小但非零开销),建议在单例或静态变量中复用它。

classTextUtils{staticfinal _unescape =HtmlUnescape();staticStringclean(String input)=> _unescape.convert(input);}

三、常见应用场景

3.1 场景 1:RSS 阅读器

RSS Feed 中的标题和摘要通常包含大量的 HTML 实体,需解码后展示。

// RSS 解析器通常返回已解码的文本,但如果返回 raw XML:final title =parse(item.title).text;// 或者final cleanTitle = unescape.convert(item.rawTitle);
在这里插入图片描述

3.2 场景 2:搜索结果高亮

搜索引擎返回的摘要中,关键字被 <em> 包裹,需提取纯文本或自行构建高亮。

// 原始: "Hello <em>World</em>"// 解码后: "Hello <em>World</em>" (注意 unescape 只处理实体,不处理标签)// 若要处理实体如 "&lt;em&gt;" -> "<em>"

3.3 场景 3:聊天消息

防止用户输入被解释为 HTML(XSS),后端转义后,前端需在特定安全上下文中还原(如代码块内)。

classCodeBlockextendsStatelessWidget{finalString rawCode;// 后端返回如 "print(&quot;Hi&quot;)"@overrideWidgetbuild(BuildContext context){returnText(HtmlUnescape().convert(rawCode));// 显示 print("Hi")}}

四、OpenHarmony 平台适配

4.1 纯 Dart 实现

无平台依赖,OpenHarmony 完美支持。

五、完整示例代码

本示例模拟一个从网络获取新闻列表的场景,原始数据充斥着实体字符,App 将其清洗后展示。

import'package:flutter/material.dart';import'package:html_unescape/html_unescape.dart';classNewsFullDemoPageextendsStatelessWidget{constNewsFullDemoPage({super.key});@overrideWidgetbuild(BuildContext context){final unescape =HtmlUnescape();final articles =[{'t':'Breaking &amp; Hot: OHOS 5.0 Release','s':'New &lt;Features&gt; inside!'},{'t':'Caf&eacute; Life: Best Coffee &#9749;','s':'Visit us &copy; 2026'},];returnScaffold( appBar:AppBar(title:constText('实战:纯净新闻阅读')), body:ListView.separated( itemCount: articles.length, separatorBuilder:(_, __)=>constDivider(), itemBuilder:(context, index){final a = articles[index];returnListTile( title:Text(unescape.convert(a['t']!), style:constTextStyle(fontWeight:FontWeight.bold)), subtitle:Text(unescape.convert(a['s']!)), trailing:constIcon(Icons.navigate_next),);},),);}}
在这里插入图片描述

六、总结

html_unescape 是处理 Web 数据的必备小工具。

最佳实践

  1. 按需使用:不要对所有文本都调用,不仅浪费性能,还可能破坏原本就是想显示 &amp; 的意图。
  2. 安全性:解码后的文本若直接插入 HTML(如 WebView),务必小心 XSS 攻击。通常在 Flutter Widget (Text) 中显示是安全的。

Read more

MedGemma X-Ray部署教程:开源医疗大模型+国产GPU适配实践(昇腾/寒武纪)

MedGemma X-Ray部署教程:开源医疗大模型+国产GPU适配实践(昇腾/寒武纪) 1. 这不是另一个“玩具模型”,而是一套真正能看片的AI助手 你有没有试过把一张胸部X光片上传给AI,几秒钟后它就告诉你:“左肺上叶见斑片状模糊影,边界欠清,建议结合临床进一步排查感染可能”?这不是科幻电影里的桥段,而是MedGemma X-Ray正在做的事。 它不生成虚构图像,不编造医学术语,也不用“可能”“大概”来搪塞——它专注一件事:读懂一张标准PA位胸片,并用医生能理解的语言说清楚看到了什么。没有炫酷的3D重建,没有花哨的UI动效,只有稳定、可复现、结构清晰的影像分析结果。 更关键的是,它不是只在A100或H100上跑得飞快的“纸面模型”。这套系统已实测通过国产硬件适配:在昇腾910B和寒武纪MLU370上完成端到端推理验证,模型权重、推理引擎、前后端服务全部打通。这意味着——你不需要租用海外云GPU,也能在本地服务器上跑起一个真正可用的医疗影像分析工具。 本文将带你从零开始,完整走通部署全流程:环境准备、脚本使用、国产卡适配要点、常见报错定位,以及如何判断“

By Ne0inhk
【Microi吾码】开源低代码平台-Microi吾码-一键安装使用(CentOS一键安装MySql+Redis+MinIO+MongoDB+Watchtower脚本)

【Microi吾码】开源低代码平台-Microi吾码-一键安装使用(CentOS一键安装MySql+Redis+MinIO+MongoDB+Watchtower脚本)

📕作者简介:热爱跑步的恒川,致力于C/C++、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。 📗本文收录于Microi吾码系列专栏,大家有兴趣的可以看一看 📘相关专栏C语言初阶、C语言进阶系列、恒川的日常汇报系列等,大家有兴趣的可以看一看 📙Python零基础入门系列,Java入门篇系列、docker技术篇系列、Apollo的学习录系列正在发展中,喜欢Python、Java、docker的朋友们可以关注一下 开源低代码平台-Microi吾码 * 前言 * CentOS7一键安装脚本 * 注意事项: * 安装成功预览图 * 安装过程图 * 安装结果docker * 脚本代码【有点东西:)】 * 踩过的坑 * Microi吾码 - 系列文档 Microi吾码是一个开源的低代码平台,旨在通过简化应用程序开发过程,帮助开发者和非开发者快速创建和部署应用。低代码平台通过可视化界面、拖拽操作、预设模板等方式,降低了编程的复杂度,让用户能够以更少的编码工作完成应用开发。 前言 有小伙伴提出他并不想在本地编译代码、打包镜像、上传镜

By Ne0inhk
2026年AI Agent框架王者:OpenClaw登顶GitHub TOP1,16大小龙虾生态项目(含OpenClawChinese汉化版)技术特性与GitHub地址汇总

2026年AI Agent框架王者:OpenClaw登顶GitHub TOP1,16大小龙虾生态项目(含OpenClawChinese汉化版)技术特性与GitHub地址汇总

🦞 "OpenClaw龙虾家族"全员集结!OpenClaw登顶GitHub TOP1,Kimi/miniMax/阿里/百度/字节/网易集体入局,16大小龙虾框架谁是你的菜? 🔥 历史性时刻:2026年3月,OpenClaw以26万+ GitHub Stars正式超越React(24.3万星)和Linux(21.8万星),登顶全球开源项目TOP1!但这只是开始——随着Kimi AI、MiniMax、阿里、百度、字节、网易等巨头集体入局,加上NullClaw、OpenFang等新锐开源项目崛起,一个庞大的 “龙虾家族” 正在形成。 生态全景数据:⭐ OpenClaw:26万+ Stars,GitHub史上最快增长记录🌙 KimiClaw:Moonshot AI官方云托管,40GB云存储+5000技能⚡ MaxClaw:MiniMax出品,10秒部署,

By Ne0inhk
Git 提交信息的规范化简写格式

Git 提交信息的规范化简写格式

你想了解的是 Git 提交信息的规范化简写格式(也常被称为 Conventional Commits 规范),除了 feat、fix、refactor 之外,还有很多不同类型的前缀可以让提交信息更清晰、更有语义。 完整的规范提交前缀及含义 以下是业界通用的 Conventional Commits 规范中常用的前缀,按使用场景分类,每个前缀都有明确的语义: 前缀中文含义使用场景举例feat新增功能feat: 新增商品详情页分享功能fix修复 Bugfix: 修复移动端下拉刷新数据重复的问题refactor代码重构(无功能变更)refactor: 重构订单列表组件,优化代码结构docs文档修改docs: 更新 README 中的接口使用说明style代码格式调整(无逻辑变更)style: 格式化代码缩进,修正变量命名规范test测试相关test: 为用户登录接口添加单元测试chore琐碎工作(构建/工具等)chore: 升级依赖包 axios 到 1.6.0 版本perf性能优化perf: 优化商品列表查询 SQL,提升接口响应速度build构建相关(

By Ne0inhk