富文本信息存储显示?乱码问题
来源:互联网 发布:淘宝店铺入驻规则 编辑:程序博客网 时间:2024/06/06 03:43
前两天遇到了一个前台富文本保存异常的问题,具体表现为前台编辑好的富文本保存后再次查看会发现每一行的缩进都变成了 ? ,页面显示非常糟糕,寻求解决的办法。
bug背景
- 项目前台采用了ext组件提供的富文本编辑框(老项目的无奈)
- 文件在进入java处理之前经过了基于antisamy框架的防xss攻击filter
- 数据库为oracle,页面编码格式为UTF-8
解决过程
debug模式逐步跟进bug,追踪缩进在哪一步变成?乱码。最开始怀疑是页面格式没有严格限定为UTF-8,导致数据库不能识别。结果发现两点异常:
1.数据库有正常存储的空格;2.断点跟进发现前台信息在进入java存储代码时已经变成了?
也就是说,问题很可能出在antisamy框架上。
然后我把debug的断点打到了filter里,request传入时,显示正常。出filter时,就不正常了。那只好把断点跟进了框架里,最终发现异常出现在执行了antisamy框架对输入进行decode,也就是说decode()方法将缩进变成了空格。
下一步就是求助搜索引擎了。以下内容来自网络:
在UTF-8编码和ASCII码中,空格都对应0x20,但在UTF-8不是所有的空格都会被认为是0x20,有一种空格宽度不会被压缩,这种不会被压缩的空格对应的字节码是“0xC2 0xA0”。
缩进就是一种宽度不会被压缩的空格,也就是说缩进对应的字节码就是”0xC2 0xA0”。
由于在GB2312等其他编码中并不存在”0xC2 0xA0”,直接使用decode()进行编码转换,这个字符就会被替换为”ox3F”,对应的就是半角问号。
解决办法
知道问题原因再去解决就比较简单了,我们只需要在得到UTF-8字符的时候进行一个字符串的替换,将缩进变为标准空格,就可以解决问题。但是要注意,由于这个空格用于排版,我们再进行替换的时候,要根据富文本编辑插件的显示效果尝试插入几个空格会正常显示。替换代码如下:
byte bytes[] = {(byte) 0xC2,(byte) 0xA0};
String UTFSpace = new String(bytes,"utf-8");
html = html.replaceAll(UTFSpace, " ");
- 富文本信息存储显示?乱码问题
- 富文本乱码问题
- Android 中textview显示富文本信息
- 前台富文本编辑器文本乱码,图片正常显示,解决!
- TextView富文本显示
- UILabel显示富文本
- qlistview 显示富文本
- 将BLOB类型值在富文本显示和将富文本内容以BLOB类型存储到数据库
- 用TextView显示富文本
- Swift HTML富文本显示
- 富文本内容显示格式
- 聚沙成塔 - IStatic控件显示文本乱码问题
- oracle服务器存储信息乱码问题处理
- PLSQL Developer下报错信息显示乱码问题
- 数据库设计问题1-之富文本内容存储到mysql后的读取问题
- UILable,UIButton的富文本显示
- UILabel设置富文本格式显示
- Qt之QTableView显示富文本
- 数据库锁机制
- 《高性能spark》笔记
- 对tensorflow java api进行cpu优化
- 02-http请求头部信息
- Js WebSocket简单抽象类实现
- 富文本信息存储显示?乱码问题
- esxi
- 17. Letter Combinations of a Phone Number
- hdu 2066一个人的旅行
- Spring Boot第三弹:Spring Boot之使用YAML
- 区块浏览器——insight——替换数据源
- Hadoop 的功能和优势
- Java AOP编程
- Oracle常用函数