空格 经过html_entity_decode后在utf8编码下乱码的问题
- 2920
- PHP
- 0
- super_dodo
- 2021/03/23
今天遇到在发邮件的部分,用户出现乱码的情况。?0?2这样的表现。查看数据表编码和代码的编码都是utf-8,在邮件发送的头部也加上了html的标签utf-8但是始终还是不行。经排查如下:
普通ASCII码空格为32,但是浏览器会对普通空格进行自动归并,
也就是如果你输入10个0x20的空格在HTML页面里面,可能会被合并成一个空格。
如果想要一致的呈现多个空格,就要用到 ,这个空格的编码为160,为西欧ISO-8859-1编码标准。
为了让经过HTML编码的内容还原为原来的文本字符,可以使用html_entity_decode方法,
但这样问题就来了,通常HTML编码内容为UTF8格式的,html_entity_decode在浏览器UTF8编码环境下会把
 转为一个黑色四方形状的乱码。只有切换为ISO-8859-1才能正确显示为空格。
所以在使用html_entity_decode时,需要设置character-set为UTF-8,这样就可以避免乱码问题。
html_entity_decode($value,ENT_NOQUOTES,'UTF-8');
$content = " <h1>你好啊</h1> 大家好才是真的好啊 <!-- 注释 -->"; // htmlspecialchars_decode将实体转为html标签 $content = htmlspecialchars_decode($content); $content = strip_tags($content," <h1> <h2><a> <h3> <h4> <h5> <h6><b><img><iframe>"); // html_entity_decode 将实体转为html标签,但是会将空格转为乱码,所以转的时候需要将空格符替换为一个字符[space_code] $content = str_replace(" ","[space_code]",$content); $content = html_entity_decode($content); $content = str_replace("[space_code]","",$content);
htmlentities 和 htmlspecialchars 的区别在于 htmlentities 会转化所有的 html character entity,而htmlspecialchars 只会转化手册上列出的几个 html character entity (也就是会影响 html 解析的那几个基本字符)。一般来说,使用 htmlspecialchars 转化掉基本字符就已经足够了,没有必要使用 htmlentities。实在要使用 htmlentities 时,要注意为第三个参数传递正确的编码。
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例