Android技术问题:SQLite字符串无法在TextView解析为HTML,API返回则正常
解决SQLite取出的HTML字符串无法在TextView正确解析的问题
我之前也碰到过一模一样的坑!问题大概率出在HTML字符串存入SQLite时被转义了——比如你存进去的<br/>变成了<br/>, 变成了&nbsp;,导致从数据库取出后,Html.fromHtml()把这些转义后的字符当成普通文本,而不是可解析的HTML标签。
下面分两种场景给你解决方案:
场景1:还没存入数据,或者可以重新存储
直接修复存储逻辑,确保存入SQLite的是原始HTML字符串,不要做额外的转义处理:
- 如果是从API拿到HTML后直接存储,跳过任何手动转义(比如不要调用
Html.escapeHtml()); - 用参数化SQL或Room等ORM框架存储,避免拼接SQL时的自动转义(参数化查询会自动处理SQL注入,同时不会破坏HTML结构)。
场景2:已经存了转义后的字符串,不想重新存储
取出字符串后先做反转义处理,再传给Html.fromHtml():
方法1:用Html.fromHtml反转义(推荐)
利用Html.fromHtml()的解析能力先把转义字符还原成原始HTML标签,再二次解析显示:
String summaryText = // 从SQLite取出的转义字符串 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 第一步:反转义得到原始HTML String unescapedHtml = Html.fromHtml(summaryText, Html.FROM_HTML_MODE_LEGACY).toString(); // 第二步:正常解析HTML显示 sinopsis.setText(Html.fromHtml(unescapedHtml, Html.FROM_HTML_MODE_COMPACT)); } else { String unescapedHtml = Html.fromHtml(summaryText).toString(); sinopsis.setText(Html.fromHtml(unescapedHtml)); }
方法2:手动替换转义字符(适合简单场景)
如果只有少数几种转义字符(比如<、>、&、 ),可以直接字符串替换:
String summaryText = // 从SQLite取出的转义字符串 String unescapedHtml = summaryText .replace("<", "<") .replace(">", ">") .replace("&", "&") .replace(" ", " "); // 然后正常设置TextView if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { sinopsis.setText(Html.fromHtml(unescapedHtml, Html.FROM_HTML_MODE_COMPACT)); } else { sinopsis.setText(Html.fromHtml(unescapedHtml)); }
额外排查点
- 先打印取出的字符串确认:用
Log.d("SQLite_HTML", summaryText)看看输出是不是有<这类转义字符,这是最直接的排查方式; - 如果用Room,检查实体类的字段有没有加不必要的
@TypeConverter,避免框架自动转义HTML内容。
内容的提问来源于stack exchange,提问作者anovan
相关产品推荐
相关产品推荐

